- 公開日:2019年01月20日
- 最終更新日:2019年01月20日
記事概要
機械学習でデータ分析をするときに気が付いたこと、得た知見のまとめ
記事の対象者
- 機械学習の基礎を理解している
- 実務で機械学習を利用している
- kaggleで機械学習を利用している
記事で使うデータ
- kaggleのtelco-customer-churnのデータを使います。
Categoricalデータ取得
Categoricalデータを取得するとき、pandas_profilingでEDA(探索的データ解析)でデータを見ながら、必要な変数名をコピペしながら配列に設定していくことが多々あります。
Categoricalデータはone_hot_encode化して分類器にかけることがほとんどだと思うので(特にkaggleとか)、以下のようにdtype=objectのデータを取ってきてしまうと便利です。
categorical_train = df.select_dtypes(include=object)
Categoricalデータは、dtype=objectであることが多いので、とても役に立ちます。
当然データによっては不要なカラムもあるので、その場合、不要なカラムはdropで消しましょう。
extracted_categorical_train = categorical_train.drop(['customerID', 'TotalCharges', 'Churn'], axis=1)
命名する変数名は、実装時にきちんと考えましょう。地雷化したコードが多すます。
モデル実装
モデルをチューニングしてモデルの性能検証をする場合は、以下の流れで行います。
- GridSearchCVでモデルのハイパーパラメータを測定
- 交差検証でモデルの性能を測定
モデルの汎化性能を測定するには、交差検証だけでなく、k分割を使うとさらに良いです。
まずはGridSearchCVを使ってハイパーパラメーターを決定します。
from sklearn.model_selection import GridSearchCV from sklearn.model_selection import KFold from sklearn.ensemble import RandomForestClassifier clf = RandomForestClassifier() # 試行するパラメータを羅列する params = { 'max_depth': list(range(1, 20)), 'criterion': ['gini', 'entropy'] } # KFoldクラスで分割数を指定する kFold = KFold(n_splits=5, shuffle=True, random_state=0) grid_search = GridSearchCV(clf, # 分類器を渡す param_grid=params, # 試行してほしいパラメータを渡す cv=kFold, # KFoldで汎化性能を調べる ) # グリッドサーチで優れたハイパーパラメータを探す grid_search.fit(X, y) # 最も良かったスコア print(grid_search.best_score_) # 上記を記録したパラメータの組み合わせ print(grid_search.best_params_)
上記を実行します。
0.8036348147096408 {'criterion': 'entropy', 'max_depth': 8}
accuracyとハイパーパラメーターが出力されました。
上記のハイパーパラメーターを使って交差検証でモデルの性能を測定します。
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score # 引数はdictで渡せないので注意。 clf = RandomForestClassifier(criterion= 'entropy', max_depth=8) scores = cross_val_score(clf, X, y, scoring='accuracy', cv=kFold) print(scores) print(scores.mean())
実行します。
[0.7920511 0.80624556 0.79418027 0.79545455 0.81676136] 0.8009385686173301
これでGridSearchCVでモデルのハイパーパラメータを測定して、交差検証でモデルの性能を測定できました。
まとめ
機械学習は慣れるまで大変ですが、素晴らしい技術なので頑張って身につけてください。
機械学習エンジニアは不要になるとか、クラウドで全部できるようになるとか言う人がいますが、真に受けて学習を怠ってはいけません。
プログラマーは不要になるとか、大企業は潰れないとか、世の中に流れている通説はほとんど嘘です。
リターンの大きい技術なので、是非頑張ってください。
以上です。