俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

エピソード3-9: 異常値(外れ値)を除いてみて精度を向上するか確認する。(KaggleでKickstarter Projectsに挑戦する。)

「Kaggle」のデータセットKickstarter Projects」にて、更に精度を向上させるために異常値の除去についても検討します。

これまでの流れは以下にまとめてあるのでご参照ください。

oregin-ai.hatenablog.com

 

国別とカテゴリーは成功率なので異常値はないと判断し、「goal」と「backers」の異常値について考えます。

 

1.「goal」の異常値について考えてみる。

「goal」異常値について考えます。

まずは「ヒストグラムを見てみます。

#'goal'についてヒストグラムを書いてみる
plt.hist(df_f18_SRate['goal'],log=True)
plt.show() 

f:id:kanriyou_h004:20190519210127p:plain


 

1e8あたりに外れ値がありそうなので、件数と、近辺のグラフと、データを見てみまする。

#ヒストグラムで少し離れている1e8のあたりに着目してみる。 
df_tmp = df_f18_SRate['goal'][df_f18_SRate['goal']>99999999]
#件数数える
display(df_tmp.shape)
#ヒストグラム描いてみる
plt.hist(df_tmp) plt.show()
#データ見てみる
display(df_tmp)
(19,)

f:id:kanriyou_h004:20190519210606p:plain

1514      100000000.0
58470     100000000.0
68612     100000000.0
86687     100000000.0
93295     100000000.0
93426     100000000.0
95647     100000000.0
96653     100000000.0
128171    100000000.0
135722    100000000.0
166919    100000000.0
170659    100000000.0
172789    100000000.0
184178    100000000.0
185267    100000000.0
186427    100000000.0
194729    100000000.0
196342    100000000.0
201782    100000000.0
Name: goal, dtype: float64

データの数は19件で、すべて100,000,000なので、上限値で頭打ちにされていそうなので、この19件は学習から除外することにします。

2.「backers」の異常値について考察してみる。

 「backersl」の異常値についても考えます。

まずは「ヒストグラムを見てみます。

#'backers'についてヒストグラムを書いてみる
plt.hist(df_f18_SRate['backers'],log=True)
plt.show()
 

f:id:kanriyou_h004:20190519211110p:plain

150,000以上に外れ値がありそうです。

#ヒストグラムで少し離れている150000のあたりに着目してみる。
df_tmp = df_f18_SRate['backers'][df_f18_SRate['backers']>150000]
#件数数える
display(df_tmp.shape)
#ヒストグラム描いてみる
plt.hist(df_tmp)
plt.show()
#データ見てみる
display(df_tmp)
 

(2,)

f:id:kanriyou_h004:20190519211254p:plain

98446 154926.0
122168 219382.0
Name: backers, dtype: float64


 この2件も外れ値として学習からのぞくことにします。

 

3.異常値(外れ値)を除いたデータフレームを作る。

これまで検討してきた異常値(外れ値)を除いたデータフレームを作ります。

#####################################
#異常値を除いたデータフレームを作る。
#####################################
#goalの異常値を除いたデータフレーム
df_train = df_f18_SRate[df_f18_SRate['goal']<99999999]
#さらに、backersの異常値を除いたデータフレーム
df_train = df_train[df_train['backers']<150000]
df_train.shape

 (206968, 21)

 

4.異常値(外れ値)を除いたデータフレームを使ってロジスティック回帰で分類してみる。

 異常値(外れ値)を除いたデータフレームを使ってロジスティック回帰で分類してみます。


#********************************************************************
#.ロジスティック回帰で分類してみる。
#********************************************************************
#目的変数'state'を正解としてyに格納
y = df_train['state'].values
#説明変数'goal','backers','days','country_rate','main_category_rate',
#'category_rate'を入力としてXに格納

X = df_train[['goal', 'backers','days','country_rate','main_category_rate','category_rate']].values
#ロジスティック回帰で学習
clf = SGDClassifier(loss='log', penalty='none', max_iter=10000, fit_intercept=True, random_state=1234)
clf.fit(X, y)
#********************************************************************
#.予測精度または識別精度を確認する
# 混同行列を作成し、Accuracy、Recall、Precisionを求める
#********************************************************************
# 学習した結果を使って説明変数を入力して予測
y_est = clf.predict(X)
#混同行列を作成
tn, fp, fn, tp = confusion_matrix(y, y_est).ravel()
print(fn, fp)
print(tn, tp)
#'Accuracy、Recall、Precisionを求めて表示
print('Accuracy = {:.3f}%'.format(100 * (tn+tp)/(tn+fp+fn+tp)))
print('Recall = {:.3f}%'.format(100 * (tp)/(fn+tp)))
print('Precision = {:.3f}%'.format(100 * (tp)/(fp+tp)))

4330 13839
109364 79435
Accuracy = 91.221%
Recall = 94.831%
Precision = 85.163%

異常値(外れ値)を除くことで、わずかですが、Accuracyが91.171%から、91.221%まで上昇しました。

次回は、このデータをつかってSVMにも挑戦してみたいと思います。

今後もさらなる向上を目指して頑張ります!

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com