「Kaggle」のデータセット「Kickstarter Projects」にて、更に精度を向上させるために異常値の除去についても検討します。
これまでの流れは以下にまとめてあるのでご参照ください。
国別とカテゴリーは成功率なので異常値はないと判断し、「goal」と「backers」の異常値について考えます。
1.「goal」の異常値について考えてみる。
「goal」異常値について考えます。
まずは「ヒストグラムを見てみます。
#'goal'についてヒストグラムを書いてみる plt.hist(df_f18_SRate['goal'],log=True) plt.show()
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件で、すべて100,000,000なので、上限値で頭打ちにされていそうなので、この19件は学習から除外することにします。
2.「backers」の異常値について考察してみる。
「backersl」の異常値についても考えます。
まずは「ヒストグラムを見てみます。
#'backers'についてヒストグラムを書いてみる plt.hist(df_f18_SRate['backers'],log=True) plt.show()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,)
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検定を受験し、見事合格できました!
受験の体験記や勉強法などを別のブログにまとめました。
これから受験される方がいらっしゃいましたらご参考まで。