Python|機械学習
欠損値の補完
欠損値補完の流れは以下の通り。
- 欠損値の数を確認
- ヒストグラムで表示し、欠損値の補完方法を考える
- 欠損値を補完する
- 欠損値の数を確認
欠損値を平均値で補完する場合
data.isnull().sum()
# 各カラムの欠損値の数が表示される。
plt.hist(data['カラム名'])
plt.show()
# 指定したカラムのヒストグラムが表示される。
average = data['カラム名'].mean()
data.update(data['カラム名'].fillna(average))
# 欠損値を平均値で補完。
data['カラム名'].isnull().sum()
# 欠損値が補完されていれば、0が表示される。
欠損値を指定の値で補完する場合
data.isnull().sum()
# 各カラムの欠損値の数が表示される。
plt.hist(data['カラム名'])
plt.show()
# 指定したカラムのヒストグラムが表示される。
null = -1
data['カラム名'].fillna(null,inplace=True)
# 欠損値を -1 で補完。
data['カラム名'].isnull().sum()
# 欠損値が補完されていれば、0が表示される。
欠損値を補完せず、削除する場合
data.isnull().sum()
# 各カラムの欠損値の数が表示される。
plt.hist(data['カラム名'])
plt.show()
# 指定したカラムのヒストグラムが表示される。
data = data.dropna()
# 欠損値のある行を削除する。
data['カラム名'].isnull().sum()
# 欠損値が補完されていれば、0が表示される。
学習データと検証データの分割
準備
from sklearn import tree
# 決定木のライブラリをインポート
X = data.drop('目的変数のカラム名', axis=1)
# Xに目的変数のカラムを除いたdata変数(つまり、説明変数)を代入。
y = data['目的変数のカラム名']
# yに目的変数を代入。
学習データと検証データに分割
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3, shuffle=False)
# 説明変数と目的変数を7:3の割合で学習データと検証データに分割。
X_train, X_test, y_train, y_test
_train
は学習データ、_test
は検証データ用の変数。
train_test_split
scikit-learnの関数。データを学習データと検証データに分割する。
train_test_split(X,y,test_size=0.3,shuffle=False):
X
: 分割する説明変数のデータ。
y
: 分割する目的変数のデータ。
text_size=0.3
: テストデータのサイズを全体の0.3(30%)に設定。
shuffle=False
: データ分割時にシャッフルをしないように設定。デフォルトはTrue
。
モデリング(決定木モデル)
一般的な機械学習の流れは以下の通り。
- パラメータチューニング
- 特徴量の追加
- 評価指標
準備
d_tree = tree.DecisionTreeClassifier(random_state=0)
# d_tree に決定木のインスタンスを代入。
random_state=0
この設定を行うことで、結果の再現性が確保できる。
学習
d_tree = d_tree.fit(X_train, y_train)
# 先ほど作成した X_train, y_trainをfitし、d_treeを更新ている。
.fit()メソッド
指定された学習データを使用して、モデルの学習を行う。返り値に学習後のモデルを返す。
予測
y_pred = d_tree.predict(X_test)
# X_testのデータを使って、目的変数を予測している。
.predict()メソッド
入力データに対するモデルの予測を行う。
予測精度の確認
print(accuracy_score(y_test, y_pred))
# y_test, y_predの値を比較して正解率を算出。
from sklearn.metrics import confusion_matrix
# confusion_matrixという関数をインポート。混合行列を作成する用。
cm = confusion_matrix(y_test, y_pred)
# 混合行列の作成。
.accuracy_score(A,B)
正解率を算出するメソッド。Aに解答、Bに予測値を代入する。
confusion_matrix(A,B)
混合行列を作成する関数。Aに解答、Bに予測値を代入する。
モデル改善
d_tree = tree.DecisionTreeClassifier(max_depth=4, random_state=0)
# 予測精度改善のため、再度d_treeを生成。今回はmax_depthを4に指定。
作成し直したd_treeモデルで再度学習, 評価, 正解率の確認, 混合行列の確認を行い、モデルが改善されているかどうかを確認する。
max_depthの変更のほかに、min_samples_split
やmin_impurity_decrease
の値を変更しながら様子を確認してみる。正解率が向上した場合、混合行列、適合率、再現率、F値も確認し、適切かどうか確かめる。
precision_score(A,B)
適合率(Positiveと予想した値のうち、実際の値がPositiveであった確率)を計算する関数。
recall_score(A,B)
再現率(実際にPositiveである値のうち、Positiveであると予測した確率)を計算する関数。
f1_score(A,B)
F値(再現率と適合率の調和平均)を計算する関数。
モデリング(ロジスティック回帰)
準備
from sklearn.linear_model import LogisticRegression
# ロジスティック回帰のライブラリをインストール。
logistic_regression = LogisticRegression(random_state=0)
# logistic_regressionにロジスティック回帰を読み込み。
学習
logistic_regression = logistic_regression.fit(X_train, y_train)
# fit関数で学習し、logistic_regressionを更新。
予測
y_pred = logistic_regression.predict(X_test)
# 予測値を作成し、y_predに代入。
予測精度の確認
cm = confusion_matrix(y_test, y_pred)
# 混合行列の作成
print(f1_score(y_test, y_pred))
# F値の算出。
参考にさせていただいた記事
Discussion