👏

Python|機械学習

2023/10/03に公開

欠損値の補完

欠損値補完の流れは以下の通り。

  1. 欠損値の数を確認
  2. ヒストグラムで表示し、欠損値の補完方法を考える
  3. 欠損値を補完する
  4. 欠損値の数を確認

欠損値を平均値で補完する場合

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

モデリング(決定木モデル)

一般的な機械学習の流れは以下の通り。

  1. パラメータチューニング
  2. 特徴量の追加
  3. 評価指標

準備

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_splitmin_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値の算出。

参考にさせていただいた記事

https://note.nkmk.me/python-sklearn-train-test-split/

Discussion