#はじめに
この記事ではpythonのライブラリであるsickit-learnを使用して、機械学習の分類問題の実装を説明します。機械学習初心者の方に機械学習の流れを掴んでいただくことを目的とします。(ぼくも初心者)
#分類問題とは
機械学習は大きく分けて下記の2種類あります。
- 教師あり学習:正解データを与えて予測する方法
- 教師なし学習:正解データを与えないで予測をする方法
さらに、教師あり学習にもいくつかの種類があります。
- 分類:定性的データを予測する
- 回帰:定量的データを予測する
定性的データというのは、すこしイメージがしにくいかと思いますが、ABCなどのランク分けといったグループ分けするようなものです。
定量的データは、値段や偏差値等の数値などのことを示します。
#環境
- python 3.6.5
#流れ
今回使用するテーマは「ワイン」です。機械学習の分類問題に置ける最も有名なテーマの1つです。
あらゆるワインのデータをインプットとして、そのワインがどのランクのワインかを分類する問題です。
データは下記のURLよりダウンロードしてください。
https://archive.ics.uci.edu/ml/datasets/Wine
下記の流れにそって説明していきたいと思います。
1.データの分割
2.データの標準化
3.学習
4.テスト
#1.データの分割
機械学習は学習用データとテスト用データの2種類に分けます。
テスト用のデータは学習してできたモデルの評価を行なうために作成します。
評価の際は未知のデータである必要があるためテスト用データとして学習前からデータを分けておきます。
データの分割にはおもに以下の2つの手法があります。
- ホールドアウト法
- K分割交差検証
この2つそれぞれの手法の詳しい説明は省きますが、
データ量が多い時:ホールドアウト法
データ量が少ない、データに偏りがる時:K分割交差検証
と覚えておいてください。
※「データに偏りがある」とは、
たとえばAとBの正解データがあるとした時、Aのデータは10000個あるが、Bのデータは100個
しかない状態を「データに偏りがある」と言います。
実際に使用するときは以下のようになります。
#ライブラリをインポート
from sklearn.model_selection import train_test_split
#分割
X_train , X_test , y_train , y_test = train_test_split(X,y,test_size=0.2)
#ライブラリをインポート
from sklearn.model_selection import StratifiedKFold
#インスタンスを生成
kfold = StratifiedKFold(n_splits=5)
#2.データの標準化
定量的なデータには大小が存在するため、標準化というものを行います。
標準化を行うことでデータ同士の重みを整えることができます。
言葉で説明するとわかりにくいですが、
例えば、以下の様に2つのワインに甘さと酸味で違いがあったとき、
甘さ | 酸味 | |
---|---|---|
ワイン1 | 100 | 2 |
ワイン2 | 200 | 3 |
このまま数値的に考えると甘さの絶対値が大きいので、重要度が上がってしまいます。
このような事態を防ぐために、標準化を行います。
#ライブラリをインポート
from sklearn.preprocessing import StandardScaler
#インスタンスを生成
sc.fit(df.iloc[:,:-1])
#標準化
sc_df = pd.DataFrame(sc.transform(df.iloc[:,:-1]))
以上のようにデータを分割し整えたあとに、機械学習を行います。
#3.学習
今回は学習にscikit-learnにある分類問題のライブラリのうち、
ロジスティック回帰
を使用します。
ロジスティック回帰は回帰と書いてあるがれっきとした分類問題における予測モデルです。
scikit-learnのライブラリにありますので、難しいことは考えずに以下のようにインスタンスを
作成することで、ロジスティック回帰を使う準備はできます。
モデル作成の手順は以下の通りです。
・インスタンスの生成
・モデルの作成(学習開始)
#ライブラリをインポート
from sklearn.linear_model import LogisticRegression
#インスタンスを生成
clf_lr = LogisticRegression(penalty='l1',C=10000)
#学習モデル作成
clf_lr.fit(X=X_train,y=y_train)
今回使用するくらいのデータ数ですと一瞬で終了しますが、これがランダムフォレストなど、
比較的計算量の多い予測モデルを使用すると処理時間は長くなります。
モデルの作成後はそのモデルの精度を確かめます。
精度を確かめるときに使うデータは学習データであるので、
精度が高いことは当たり前といえます。
#モデルを学習データに適用
clf_lr.score(X=X_train,y=y_train)
>>> 0.8023683135973867
#4.テスト
そのモデルが本当に良いモデルなのを確かめるのに、
テスト用データを使用します。(おまちかね!)
#モデルを学習データに適用
clf_lr.score(X=X_test,y=y_test)
>>> 0.8048182931808902
これで結果はでましたね。良い結果ですね。
以上で今回は終わりますが、次回以降は回帰問題の説明をしようかなと考えてます。
お読みいただきありがとうございました。
See You Later