page
公開中のFluentdプラグイン
5
rewrite-tag-filter geoip mysql-replicator munin twitter anonymizer mysql-query
gamobile watch-process twilio sentry feedly
page
執筆書籍
6
サーバ/インフラエンジニア養成読本ログ収集~可視化編 [現場主導のデータ分析環境を構築!] (Software Design plus) 出版社/メーカー: 技術評論社 定価: 本体1,980円+税
サービスへの思い• 取引慣習が戦後から変わらないブラックボックスな不動産業界
• この問題を解決すべく、ビッグデータを活用した公平な情報を利用者に提供することで、不動産市場を活性化する
• 建物の中立評価や部屋毎の市場価格とその価格推移履歴を公開
• 適正価格が分かることで、安心したマンション選びを実現する
• 消費者が気軽に住み替えられる循環型社会を実現する
イエシルが提供するもの• ビッグデータを活用した、売買判断に必要な情報を提供!• 部屋ごとの市場価格をリアルタイム査定(特許出願中)!• 価格推移の可視化!• 物件に関する中立なレイティングデータ公開!• 利便性・治安・地盤情報など8項目!• 不動産の売買仲介サービスを提供
イエシルが解決する課題• 値付けの不透明性!• 現在売りに出ている物件だけを見て判断せざるを得ないため、相場より少し高めなのか安めなのか分かりにくい不透明性!
• 中古住宅流通の促進!• マンションの市場価値を知る敷居を下げることでの促進!• 売り時や買い時の判断材料を提供
特許出願中の価格査定システムの概要既知の価格査定システム 特許出願中の価格査定システム
手法取引事例比較法や収益還元法、原価法を用い、物件の価格を1件ごとに算出していた。
そのため、該当マンションにおける相対価値はミクロな形でしか知り得ない。
クロールした部屋情報を所在階ごとにまとめ、部屋ごとに値付けを行う。
その結果、該当マンションにおける相場を含めて、マクロに一望できる形で可視化する
係数 価格算出に用いる係数が少ない(所在階、広さ、方位等)
価格算出に影響する係数群がオープンデータ含め多岐にわたる
過去価格の可視化 現在の価格査定用に作られているため難しい 先進的な時間軸における価格形成モデルを構築
することで、過去価格の変動も可視化できる高級物件の査定
周辺・類似事例も少ない場合には、大きく外れることもある
パンフレット等から収集した新築価格も利用することで、納得感のある値付けを実現
査定モデルの安定性 ○ ○
不動産鑑定士の評価 ○ ○
page
単回帰分析とは
19
x
y y=ax+b
) b: intercept(切片)
線形に1つの変数を用いて値を予測すること。 散布図にプロットし、その点からの距離が最小となるように描ける線を求めることが、単回帰分析の基本
page
単回帰分析とは
21
iPhone 6sの価格査定モデルを作成してみましょう
iPhone 6s 16GB:86,800円
iPhone 6s 64GB:98,800円
iPhone 6s 128GB:110,800円
iPhone 6s Plus 16GB:98,800円
iPhone 6s Plus 64GB:110,800円
iPhone 6s Plus 128GB:122,000円
page 25
-- WITH句を使って、recordsという一時テーブルを用意WITH records AS ( -- size(x), price(y) SELECT * FROM ( VALUES (16, 86800), (64, 98800), (128, 110800) ) AS t (x_value, y_value))
page 27
-- 先ほどの結果を用いて、最小二乗法の事前計算を行う SELECT SUM(x_value) as sumx, SUM(y_value) as sumy, SUM(x_value*x_value) as sumxx, SUM(y_value*y_value) as sumyy, SUM(x_value*y_value) as sumxy, COUNT(1) as cnt FROM records
page 29
-- 最小二乗法の事前計算で求めた値を用いて、モデルを求めるSELECT bunshi_a / bunbo as slope, bunshi_b / bunbo as interceptFROM ( SELECT (cnt * sumxx - pow(sumx, 2)) AS bunbo, (cnt * sumxy - sumx * sumy) AS bunshi_a, (sumxx * sumy - sumxy * sumx) AS bunshi_b FROM prepare ) calc
page 31
-- linear regression (y=ax+b)-- estimate price from size.WITH records AS ( -- size(x), price(y) SELECT * FROM ( VALUES (16, 86800), (64, 98800), (128, 110800) ) AS t (x_value, y_value)), prepare AS ( SELECT SUM(x_value) as sumx, SUM(y_value) as sumy, SUM(x_value*x_value) as sumxx, SUM(y_value*y_value) as sumyy, SUM(x_value*y_value) as sumxy, COUNT(1) as cnt FROM records)SELECT bunshi_a / bunbo as slope, bunshi_b / bunbo as interceptFROM ( SELECT (cnt * sumxx - pow(sumx, 2)) AS bunbo, (cnt * sumxy - sumx * sumy) AS bunshi_a, (sumxx * sumy - sumxy * sumx) AS bunshi_b FROM prepare ) calc
標準的なSQLで求める線形回帰分析
page
price = 212.83*size + 84043
32
iPhone 6sの回帰モデルを用いた価格査定
iPhone 6s 16GB:86,800円
87,448円(誤差0.7%) = 212.83*16 + 84043
iPhone 6s 64GB:98,800円
97,664円(誤差1.1%) = 212.83*64 + 84043
iPhone 6s 128GB:110,800円
111,272円(誤差0.4%) = 212.73*128 + 84043
page
Prestoでも単回帰分析が出来る
35
Presto v0.104より対応https://prestodb.io/docs/current/functions/aggregate.html
regr_intercept() … 傾きを計算する
regr_slope() … 切片を計算する 驚くほどシンプルに書ける ORACLEと同じ関数名なので分かりやすい
page 36
-- (Presto) y = intercept + x * slope WITH records AS ( SELECT * FROM ( VALUES (16, 86800), (64, 98800), (128, 110800) ) AS t (x_value, y_value))SELECT regr_intercept(y_value, x_value) as intercept, regr_slope(y_value, x_value) as slopeFROM records
page 37
-- (Presto UDF) y = intercept + x * slopeWITH records AS ( SELECT * FROM ( VALUES (16, 86800), (64, 98800), (128, 110800) ) AS t (x_value, y_value))SELECT regr_intercept(y_value, x_value) as intercept, regr_slope(y_value, x_value) as slopeFROM records
-- linear regression (y=ax+b)-- estimate price from size.WITH records AS ( -- size(x), price(y) SELECT * FROM ( VALUES (16, 86800), (64, 98800), (128, 110800) ) AS t (x_value, y_value)), prepare AS ( SELECT SUM(x_value) as sumx, SUM(y_value) as sumy, SUM(x_value*x_value) as sumxx, SUM(y_value*y_value) as sumyy, SUM(x_value*y_value) as sumxy, COUNT(1) as cnt FROM records)SELECT bunshi_a / bunbo as slope, bunshi_b / bunbo as interceptFROM ( SELECT (cnt * sumxx - pow(sumx, 2)) AS bunbo, (cnt * sumxy - sumx * sumy) AS bunshi_a, (sumxx * sumy - sumxy * sumx) AS bunshi_b FROM prepare ) calc
たったこれだけ!
page
精度向上をさらに図るには
38
iPhone6sの価格推定モデルを単回帰分析で作りました
価格 = 212.83*容量 + 84043 単回帰分析で求められた式では、まだ誤差がある
128GBモデルのみ少し値付けが安くなっている
128GBモデルのみ効くダミー変数を追加すると良さそう
説明変数が1つ:単回帰分析
説明変数が2つ以上:重回帰分析
page
Hivemallを用いた回帰分析
41
hivemallはHiveQLのUDFとしてTreasureDataでも使える
回帰分析 (Regression) で使えるアルゴリズムは次の5種類
Logistic Regression AdaGrad / AdaDelta (with Logistic Loss) Passive Aggressive Regression (PA1, PA2) AROW (Adaptive Regularization of Weight Vectors) Regression Polynomial Regression まず使うならAROWか、AdaGrad / AdaDeltaを使うと良い
page
Hivemall Regressionの使い道
42
ロジスティック回帰 (0/1 or -1/+1) 線形回帰 多項式回帰
Logistic Regression ✓
AdaGrad / AdaDelta (with Logistic Loss)
✓
Passive Aggressive Regression (PA1, PA2) ✓
AROW (Adaptive Regularization of Weight Vectors) Regression ✓
Polynomial Regression ✓過学習を防げるので汎用的
page 44
-- hivemallを用いた回帰分析WITH records AS ( SELECT 16 as x_value, 86800 as y_value UNION ALL SELECT 64 as x_value, 98800 as y_value UNION ALL SELECT 128 as x_value, 110800 as y_value)SELECT * FROM records
page 46
SELECT row_number() over () AS rowid, y_value AS target, array_remove(Array( 'bias', CONCAT('size:', x_value), IF(x_value=128, '128GB', NULL) ), NULL) as features FROM records
page 48
SELECT arowe_regress(features, target) AS (feature, weight, covar)FROM train
このままですと反復学習数が不足して 精度が出ないためamplifyを使います
page 49
SELECT arowe_regress(features, target) AS (feature, weight, covar)FROM ( select * from ( select amplify(20000, rowid, target, features) AS (rowid, target, features) from train ) t CLUSTER BY rand(1) ) train_amplify
page 51
-- regressionの結果から係数を求める SELECT feature, argmin_kld( weight, covar ) AS weight FROM regression GROUP BY feature
page 53
-- Hivemall AROWe regressionWITH records AS ( SELECT 16 as x_value, 86800 as y_value UNION ALL SELECT 64 as x_value, 98800 as y_value UNION ALL SELECT 128 as x_value, 110800 as y_value), train AS ( SELECT row_number() over () AS rowid, y_value AS target, array_remove(Array( 'bias', CONCAT('size:', x_value), IF(x_value=128, '128GB', NULL) ), NULL) as features FROM records), regression AS ( SELECT arowe_regress(features, target) AS (feature, weight, covar) FROM ( select * from ( select amplify(20000, rowid, target, features) AS (rowid, target, features) from train ) t CLUSTER BY rand(1) ) train_amplify), model AS ( SELECT feature, argmin_kld( weight, covar ) AS weight FROM regression GROUP BY feature)SELECT * FROM model
Hivemallを用いた回帰分析
page
回帰分析手法ごとの精度
57
iPhone 6s 16 GB
iPhone 6s 64 GB
iPhone 6s 128 GB
実価格 ¥86,800 ¥98,800 ¥110,800
単回帰分析 ¥87,448 (誤差0.7%)
¥97,664 (誤差1.1%)
¥111,272 (誤差0.4%)
重回帰分析(AROWe)
¥80,980 (誤差6.7%)
¥104,373 (誤差5.6%)
¥110,037 (誤差0.7%)
重回帰分析(PA2a)
¥85,820 (誤差1.1%)
¥99,784 (誤差1.0%)
¥111,055 (誤差0.2%)
page
オンライン学習する際のTips
60
データの種類次第だが、学習回数によって精度が変わる サンプル数が少ない時は反復学習が必要 レコードを重複させる(サンプリング手法の1つ)
綺麗なデータを数倍に重複(増幅)させておくと、 データ密度が高い方にモデルが補正される 結果的に精度が向上する
過学習に注意 学習データと予測データを分けて精度検証を行う
page
中古不動産価格査定の難しさ
62
中古マンションの価格査定 地域によって事例がほとんど存在しない 同じ部屋が市場に何度も出回ることはまず無い 築年数を重ねると値幅が広くなる 建物と部屋の修繕度合いに左右される
賃貸マンションの価格査定 どの地域にも事例が密集して存在する 同じ部屋が市場に何度も出回るので値動きが掴みやすい
page
中古不動産価格査定の難しさ
63
物件の価格は広さだけでは説明出来ません 立地(駅徒歩・眺望・バルコニー面積) 所在建物階数 建物規模・構造 販売会社やブランドのネームバリュー 土地権利
etc…
page 65
引用元: http://www.fudousan.or.jp/topics/1011/11_3.html
page
中古不動産価格査定の難しさ
66
購入者は何を評価し、何を評価しないかを考える 車社会の地域なら駅からの距離はあまり気にならない 1人暮らし物件は値段と立地重視で方位は二の次 朝出かけて夜に帰ってくる事が多いですよね? ファミリー向け物件は駅近はそれほど重要では無い
etc…
page
価格推定を行うときの知見
67
データ前処理の重要性 まるっとデータを入れれば綺麗なモデルが作れる事は無い 価格推定は経済原理を元に仮説を立てる力が必要 なるべく内挿となるように分類・集計等の前処理を行う 不足しているデータは欠損値補完をする オープンデータを組み合わせるのも1つの手段 名寄せ処理スゴク大事 自然言語処理やスコアリングなどの各種手法を応用する
page
価格推定を行うときの知見
68
R2決定係数のまやかし
説明変数を増やせば、R2決定係数は1.0に近づきがち 過学習となっているケースもあるのでモデルの精査が大事 学習データの範囲で正と負が逆転するような係数は怪しい
!
予測データから各パーセンタイルでの誤差率を出すと良い 50/60/70/80/90/95 Percentileにて誤差率が○%になる 等
MAEやRMSEの他、MER (Median Error Rate) も有用
page
価格推定を行うときの知見
69
価格査定は割と外挿となる未知の物件価格予測となる 査定モデル次第では価格が0円を割ることもある
量的変数と質的変数(ダミー変数)の使い分け 量的変数のスケーリングも大事
Z-ScoreやMin-Max normalization、対数を取るなど 量的変数であっても駅徒歩と同様に線形に推移しない場合 交差項を用いて、ある程度の範囲のみの係数を用意する いわゆる層別化
まとめ• Hadoopで動くHivemallにより、機械学習利用の敷居が下がった
• SQLで機械学習を操れるメリットはかなり大きい
• 学習データ作りが肝なので、データ前処理(正規化)は超大事
• データに関するビジネス的な知識は欠かせない
• モデルを作る際には過学習と境界線問題などに気をつけたい