はじめに
scikit-learnはPythonのオープンソース機械学習ライブラリです。サポートベクターマシン、ランダムフォレスト、k近傍法、などを含む様々な分類、回帰、クラスタリングアルゴリズムを備えており、Pythonの数値計算ライブラリのNumPyとSciPyとやり取りするよう設計されています。
機械学習には正解データがある教師あり学習と正解データがない教師なし学習があります。教師あり学習は説明変数と目的変数から学習し、未知のデータに対する予測を行います。教師あり学習の一つに分類と呼ばれる手法があり、クラス(ねこ、いぬ、うさぎなど)を予測します。分類には決定木、ランダムフォレスト、サポートベクタマシン、k近傍法などがあります。
本記事では、scikit-learnを用いた決定木、ランダムフォレスト、サポートベクタマシン、k近傍法による分類について紹介します。
1. ライブラリのインポート
まず、必要となるライブラリをインポートします。
2. データの準備
今回は学習用のデータセットである3種類のアヤメのデータを用いていきます。学習用データセットについてはこちらの記事をご覧ください。説明変数(アヤメのがくの長さ、幅、花びらの長さ、幅)と目的変数(アヤメの種類)をDataFrame型にして確認します。
出力結果は以下のようになります。
3. 学習データとテストデータに分割
学習をするためのデータとその学習によって得られたモデルを用いて精度を評価するテストデータに分割します。この方法をホールドアウト検証と言います。詳しくはこちらの記事をご覧ください。データの分割にはtrain_test_splitを用います。分割の際に学習データとテストデータの数を決定するのが、test_sizeという引数になります。以下の例ではtest_size=0.3となっており、学習データが全体の7割、テストデータが全体の3割になるように分割しています。ここでのx_train、y_trainは学習データの説明変数と目的変数で、x_test、t_testはテストデータの説明変数と目的変数です。
4. 評価項目
次章で分類を行っていきいますが、そこで精度評価を行います。ここでその精度評価の項目を確認していきましょう。
4.1 混同行列(Confusion Matrix)
混同行列では実際の分類結果と予測による分類結果の関係性を表で示しています。予測結果がどれくらい合っていて、どれくらい間違っていたかを表で確認できます。以下の表の場合、実際にはversicolorの種類ですが、virginicaと分類されてしまったケースが1件、実際にはvirginicaの種類ですが、versicolorと分類されてしまったケースが1件ありました。
一般的には以下の混同行列が使用されており、真陽性(True Positive: TP)、偽陰性(False Negative: FP)、偽陽性(False Positive)、真陰性(True Negative: TN)の4つの指標があります。
真陽性:ポジティブに分類すべきアイテムを正しくポジティブに分類できた件数を指します。
偽陰性:ネガティブに分類すべきアイテムを正しくネガティブに分類できた件数を指します。
偽陽性:ネガティブに分類すべきアイテムを誤ってポジティブに分類した件数を指します。
真陰性:ポジティブに分類すべきアイテムを誤ってネガティブに分類した件数を指します。
4.2 正解率(Accuracy)
正解率 (Accuracy) は分類器がテストデータを正しく推論できた割合で、以下の式で算出されます。
Accuracy = (TP + TN) / (TP + FN + FP + TN)
scikit-learnではsklearn.metrics.accuracy_scoreを用いて算出されます。
4.3 適合率(Precision)
適合率(Precision)は分類器がポジティブと予測した時、その内実際にポジティブな割合で、以下の式で算出されます。
Precision = TP / (TP + FP)
scikit-learnではsklearn.metrics.precision_scoreを用いて算出されます。
4.4 再現率(Recall)
再現率(Recall)は実際はポジティブに分類される時に分類器がポジティブと予測した割合で、以下の式で算出されます。
Recall = TP / (TP + FN)
scikit-learnではsklearn.metrics.recall_scoreを用いて算出されます。
4.5 F値(F-score)
F値(F-score)は適合率(Precision) と再現率 (Recall) の調和平均で求められ、0 〜 1 の間の数値で出力され、0 の場合最も悪い評価、1 の場合最も良い評価となります。
f1_score = 2 * (precision * recall) / (precision + recall)
scikit-learnではsklearn.metrics.f1_scoreを用いて算出されます。
5. 分類
以降では決定木、RandomForestによる分類、サポートベクターマシンによる分類、k近傍法による分類を行います。
5.1 決定木
決定木はDecisionTreeClassifierを用います。決定木モデルDecisionTreeClassifierをdtとして用意して、dtで決定木モデルの重み付けを学習します。分類による予測を行うにはdt.predictを用います。これにより学習に基づく予測結果y_predが算出されます。精度評価を行うには正解率(Accuracy)、適合率(Precision)、再現率(Recall)、F値(F-score)を算出します。
上記の出力結果は以下のようになります。
なお、学習した決定木は可視化することができます。可視化にはsklearn.tree.export_graphvizとgraphvizを使用します。学習後に以下の2行を追加して実行すると以下のように決定木がプロットされた図が表示されます。一番上のノードではpetsl lengthが2.6以下か、それよりも大きかで分けています。giniに不純度を意味してろい、各ノードに間違ったクラスが割り振られている確率を表しています。データを分割していくことでジニ不純度が減少していくことがわかります。このジニ不純度などの不純度が小さくなるように分割の基準を作っています。samplesはデータ数を表しています。valueは各クラスの数を表しており、ここではアヤメの各種類のSetora、Versicolor、Verginicaの数を表しています。
5.2 ランダムフォレスト
ランダムフォレストではRandomForestClassifierを用います。手順としては決定木と同じです。
上記の出力結果は以下のようになります。
5.3 サポートベクターマシン
サポートベクターマシンではSVCを用います。手順としては決定木と同様です。
上記の出力結果は以下のようになります。
5.4 k近傍法
k近傍法ではKNeighborsClassifierを用います。
上記の出力結果は以下のようになります。
オススメ書籍
Pythonによるあたらしいデータ分析の教科書
Python3エンジニア認定データ分析試験の教科書にもなっている書籍で、データ分析に必要なPythonの基礎手法を身に付けることができます。具体的には、numpyとpandasを用いたデータの前処理、matplotlibを用いたデータのグラフ化、scikit-learnを用いた機械学習の基礎記述方法を身に付けることができます。これ一つで基礎はバッチリで、実務でも十分活用できると思います。個人的には見やすい書籍でした。
データサイエンス教本 Pythonで学ぶ統計分析・パターン認識・深層学習・信号処理・時系列データ分析
こちらの書籍は初心者から少し記述できるようになった人、かつ数学的な理論と一緒にPythonの記述方法を理解したい方にオススメです。統計分析、パターン認識、深層学習、信号処理、時系列データといった幅広く実務で使用する手法を学びたい方にもオススメです。
東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析~
こちらの基礎を抑えながら実務で必要なPython記述法を学べる書籍です。基礎を一つ一つ抑えるというよりも実務で活用できるように必要な知識を身に付けられると感じました。これ一冊あれば十分かなと思いました。
スキル修得&転職
近年、DXの進展に伴うデジタル人材の需要の高まりに追いついていない状況が続いていると経済産業省がホームページで記載している通り、DX人材、IT人材が不足しているのが現状です。さらにコンピュータの性能向上やAI技術の発展により、よりDX人材、IT人材の需要が高まってきます。さらには、今後の長期間安定して職がある業種とも考えられます。
以下の求人では、IT業界の転職や、IT未経験だけどIT人材を志望する就活を支援してくれます。無料で会員登録もできるので、まずは登録だけでもして様子を見てみてはいかがでしょうか?
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
おわりに
本記事では、scikit-learnを用いた決定木、ランダムフォレスト、サポートベクタマシン、k近傍法による分類について紹介しました。本記事の内容も分類問題の基本事項なのでマスターしておきましょう。