今回はPythonのscikit-learnライブラリを使って簡単な機械学習をやってみようと思います。
機械学習で使用するサンプルデータの作成から触れているので、最近機械学習の勉強を始めた方などはぜひ参考にしてください!
scikit-learnのSVCを使って機械学習をやってみよう!
はじめに
・この記事では(身長, 体重)という特徴量をもった男女のデータを使って機械学習をします。
・正解ラベルとして男性には0を、女性には1をラベル付けしています。
なお、今回学習に使ったデータは下記コードで作成しました。詳しい内容はこちらの記事をご確認ください。
import numpy as np
n = 50
m_height = np.random.normal(171.4, 5.69, n)
f_height = np.random.normal(158.8, 5.23, n)
m_bmi = np.random.normal(21.3, 2.95, n)
f_bmi = np.random.normal(20.4, 2.39, n)
m_weight = (m_height*0.01)**2 * m_bmi
f_weight = (f_height*0.01)**2 * f_bmi
male = []
female = []
for i in range(500):
male.append((m_height[i], m_weight[i]))
female.append((f_height[i], f_weight[i]))
male_label = [0] * n
female_label = [1] * n
scikit-learnのSVCで機械学習をしてみる
では実際に機械学習をしてみましょう。
詳しいコードの説明は後述するので、はじめに機械学習のコード全文を掲載しておきます。
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
X = male + female
y = male_label + female_label
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = SVC()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
count = 0
for i in range(len(y_pred)):
if y_pred[i] == y_test[i]:
count = count + 1
print('分類精度 ' + str(100*count/len(y_pred)) + '%')
# 実行結果
# 分類成功率 87.0%
以下、コードの解説部分です。
4-7行目:訓練データ、テストデータの準備
X = male + female
y = male_label + female_label
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
4-7行目では機械学習で使う訓練データとテストデータの準備をしています。
4行目でmaleとfemaleの(身長, 体重)が格納されているリストを結合して、Xという新しいリストに格納しています。5行目ではmale_labelとfemale_labelという2つのリストを結合することでXの正解ラベルをリストyに格納しています。
7行目では訓練データとテストデータの比率が7:3になるようにscikit-learnのtrain_test_split関数を使って分割しています。
9-10行目:SVCモデルの実装・訓練データの学習
model = SVC()
model.fit(X_train, y_train)
9-10行目ではSVCモデルの実装と訓練データの学習をしています。。
9行目でSVCモデル(変数model)を用意し、10行目で4-7行目で作成した訓練データX_trainとy_trainを引数として与えることで機械学習をしています。
12行目:テストデータで検証
y_pred = model.predict(X_test)
12行目では9-10行目で用意した学習済みモデルを使ってテストデータで検証しています。
X_testを学習済みモデルに与えて得られた予測ラベルをy_predというリストに格納しています。
14-19行目:分類精度
count = 0
for i in range(len(y_pred)):
if y_pred[i] == y_test[i]:
count = count + 1
print('分類精度 ' + str(100*count/len(y_pred)) + '%')
14-19行目では分類精度を計算して画面に表示する処理をしています。
for文をy_predの要素数だけ回し、y_pred[i]とy_test[i]が一致した場合は分類に成功しているので変数countの値に1を加算します。
最後にy_predのうち、どれだけ正解ラベルと一致したのかという内容をprint文で表示しています。
まとめ
今回はscikit-learnのSVCを使って簡単な機械学習をしました。
この記事で不明な点や気になるところがあれば下のコメント欄までお願いします。それではまた!
コメント