かざいむ日誌

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

Intro to Machine Learning Lesson8 Outliers 外れ値の除外がまだ終わらない

Udacityのこの単元では、Pythonのコードで実際に外れ値を除去して、単回帰分析の精度を上げる練習を行う。

Udacity

それで、コードはほとんどセットアップされていて、書くべきコードはnumpyのndarrayで、年齢、年収、予測年収のリストを受け取って、予測年収と年収のかい離が大きい10件の外れ値のTupleを返す。

まずは、numpyの配列の計算がすごく楽なのが勉強になった(笑)

配列と配列は+演算子で項目ごとに足せるし、配列の結合も簡単。

NumPyによる数値計算の高速化 : 基礎

Numpyで行列の連結

 

ただ、外れ値上位10%のインデックスが拾えない、、、。先頭4件はこんな感じのndarrayでここから、差をerrorsにつめて、errorsの値上位10件のインデックスが欲しいけど、とれない。

print(predictions[[range(0, 4)]])
[[314.65206822]
[314.65206822]
[197.85966342]
[350.19758273]]
print(ages[[range(0, 4)]])
[[57]
[57]
[34]
[64]]
print
(net_worths[[range(0, 4)]])
[[338.08951849]
[344.21586776]
[243.79287312]
[378.84578142]]

errors = numpy.round(numpy.sqrt(numpy.square(predictions - net_worths)))
count = int(errors.size * 0.1)
idxs = numpy.argpartition(errors, -1, 0, -count)[-count: ]

このサイトを参考にしたけど、配列の形式が違うからか。

誰か助けて。

naoyashiga.hatenablog.com

 
2018/06/09追記


結局、自分で調べてもダメだったのでUdacityのForumを参考にしながら解決。

Udacity

最終的にこんなコードになりました。

errors = numpy.round(numpy.sqrt(numpy.square(predictions - net_worths)))
#予測値と実際の値の差をリストで取得(差を2乗して平方根を求めることで、マイナスをなくす)
data = numpy.c_[ages, net_worths, errors]
#行列を結合して、データをひとまとまりにする
data = data[data[:, 2].argsort()[::-1]]
#3つ目の要素でデータをソートする
count = round(errors.size * 0.1)
#外れ値とするデータの個数を計算(10パーセント)
array = data.tolist()
#データをリストに変換
del array[0: count]
#外れ値でないデータを削除
for item in array:
#対象のデータを1件ずつタプルに変換
cleaned_data.append(tuple(item))
return cleaned_data

 

qiita.com

stackoverflow.com