Kaggle の Titanic Prediction Competition でクラス分類(scikit-learn編)

統計学や人工知能(AI)を駆使してデータを分析し、課題の発見や解決に導く「データサイエンス」教育に力を入れる大学が増えてきたそうです。

データサイエンス教育拡大 AI駆使しデータ分析、人材育成へ大学注力

東北大の滝沢博胤副学長(教育・学生支援担当)は「これからの世の中はあらゆる場で膨大なデータから必要な情報を取り出して最適な答えを見つける能力が求められる。デジタル社会に必要な素養を養い、社会で活躍する人材を輩出したい」と話している。

2019.12.16 12:40 SankeiBiz(サンケイビズ)

違う部署に行っても生きていけるように学習を続けよう。

 

 

ディープラーニングが注目されていますが万能であるとは言えません。

用意したデータの数が少ない場合や、解決したい問題によっては、ディープラーニング以外の機械学習アルゴリズムのほうが適している場合があります。

Scikit-learnにはこれらの機械学習アルゴリズムが多く実装されているため、様々なアルゴリズムを使用したAI(人工知能)を作成できます。

scikit-learnって何?何ができるの?

scikit-learnは、Pythonの機械学習ライブラリです。「サイキット・ラーン」と読みます。

scikit-learnを用いて機械学習を行う際、自分が行いたい分析(分類/回帰/クラスタリングなど)について、適切なモデルを選択します。

scikit-learn アルゴリズム・チートシート」を見れば、大まかにできる事を把握できます。

scikit-learn

  • クラス分類 (Classification) – 教師あり学習。人が正解ラベル(クラス)をつけたデータを学習し、新しい入力データに対してのクラスを予測する
  • 回帰 (Regression) – 教師あり学習。人が正解ラベル(実数値)をつけたデータを学習して、新しい入力データに対しての実数値を予測する
  • クラスタリング (Clustering) – 教師なし学習。入力データを任意の数のクラスター(グループ)にまとめて、近しいデータを発見する
  • 次元削減 (Dimensionality reduction) – データの次元を削減して、要因分析をしたり、機械学習のための前処理を行なう

scikit-learnで利用可能な分類目的の機械学習モデル一覧

どれもSupervised Machine Learning(教師あり学習)となります。

モデル名 説明
LogisticRegression(ロジスティック回帰) 2群で分けられた目的変数(従属変数)に対する,1つ以上の説明変数(独立変数)の影響を調べる統計解析手法。損失関数がパーセプトロンとは異なり、正しい値でも一部を損失に含める
LinearSVC(線形SVM) カーネル関数に線形関数を使うクラス分け用のSVM
NuSVC 使うサポートベクターの数を制限したSVC
Perceptron(パーセプトロン) 損失関数は、正の値の際には変更しない。 基本は単独では使わない。線形識別の場合、ロジスティック回帰が基本使われる
SVC(SVM:サポートベクターマシン) 損失関数はパーセプトロンに類似しているが、正の値でも少しだけ損失を加える。識別境界に近いものは損失を加える。線形非線形があり、非線形がよく使われる。線形の場合、LinearSVCを使う(RBFカーネル)
GaussianNB Gaussian型Naive Bayes。ベイズの定理をもとにした学習アルゴリズム
AdaBoostClassifier(アダブースト) 前の弱学習器で誤って識別されたサンプルに対する重みを大きく、正しく識別されたサンプルに対する重みを小さくすることで、誤って識別されやすいサンプルを集中的に学習する
ExtraTreesClassifier 特徴量の重要度を特に評価したい場合
GradientBoostingClassifier(勾配ブースティング決定木) アンサンブル学習の一つ。損失関数の勾配を用いたブースティングで弱学習器に決定木を用いる
RandomForestClassifier(ランダムフォレスト) 学習データから木の構造を学習し、その構造を元にし、テストデータを予測するアルゴリズム。精度の高い分類モデルを作りたい場合
BaggingClassifier バギング分類。ランダムに生成された訓練セットの分類を組み合わせることによって分類を改善する
PassiveAggressiveClassifier データを正しく分類できたら重みを更新せず(Passive)、データを誤分類したら、そのデータを正しく分類できる最小限の量だけ重みを更新します(Aggressive)。Gmailの優先トレイで使っている
RidgeClassifier リッジ分類
SGDClassifier(SGD:確率的勾配降下法) Stochastic Gradient Descent。続最適化問題に対する勾配法の乱択アルゴリズム。目的関数が、微分可能な和の形である事が必要
GaussianProcessClassifier (ナイーブベイズのガウス分布) 正規分布を利用した回帰分析手法
KNeighborsClassifier(K近傍法) 最も近いものを探索し、最も数が多いクラスをその予測データのクラスとする
RadiusNeighborsClassifier ある半径の中に入っているもののサンプルで多数決を取る
DecisionTreeClassifier(決定木) データに対して、次々と条件を定義していき、その一つ一つの条件に沿って分類していく方法
ExtraTreeClassifier(エクストラツリー分類器)
MLPClassifier(MLP:多層パーセプトロン) Multilayer perceptron。少なくとも3つのノードの層からなる 入力ノードを除けば、個々のノードは非線形活性化関数を使用するニューロン

まとめてみましたが、よく分かりません。

ソースコード

Scikit-learnを使った機械学習は簡単です。

データクレンジングが完了した学習用データに対して次のような2行を呼ぶだけです(ランダムフォレストでオプションが無い場合)。

学習モデルを一気に試すのであれば次のような実装になります。

計算結果と正解率

出力結果です。

精度確認

出力される精度は毎回異なります。

決定木やランダムフォレストの正解率が高いようです。

Kerasでは、精度は「78%~85%」程度だったので、より高い精度となりました。

正解率確認

機械学習を用いたクラス分類の精度を評価するには、混同行列 (Confusion matrix) を作成して、正しく識別できた件数、誤って識別した件数を比較することが一般的です。

scikit-learn には、混同行列を作成するメソッドとして、sklearn.metrics.confusion_matrix があります。

二値分類(2クラス分類)においては実際のクラスと予測したクラスの組み合わせによって、結果を以下の4種類に分けることができます。

  • 真陽性(TP: True Positive): 実際のクラスが陽性で予測も陽性(正解)
  • 真陰性(TN: True Negative): 実際のクラスが陰性で予測も陰性(正解)
  • 偽陽性(FP: False Positive): 実際のクラスは陰性で予測が陽性(不正解)
  • 偽陰性(FN: False Negative): 実際のクラスは陽性で予測が陰性(不正解)

結果が次のように出力されました。

これは次のような意味になります。

実際に出力されると次のような結果となります。

正解率は、ランダムフォレスト、勾配ブースティング決定木、アダブーストなどが高いです。

まとめ

ディープラーニングを勉強するためにKerasしか利用したことがありませんでしたが、Scikit-learnの能力は凄まじいです。

ツールを使う感覚で技術やデータの中身がブラックボックスの状態でも機械学習が利用できました。

数十種類の学習モデルを呼び出しても計算時間は短く、ディープラーニングより精度が高いものもありました。

各学習モデルの具体的な中身は今後調べていきます。大学で学んだ気はしますが・・・。

データの前処理が非常に重要ですが、その部分は、まだよく分かってません。

タイトルとURLをコピーしました