Python
scikit-learn
Friday-IO

python14日目の素人だけどscikit-learnで機械学習やってみたい

More than 1 year has passed since last update.

ただのブログになってしまいました

やりたいこと

表の様な教師データがあって、特徴を与えられた時にプログラマかどうかを予測する機械学習プログラムを作って遊んでみたい

性別 年齢 職業
28 プログラマ
20 プログラマじゃない
32 プログラマ
67 プログラマじゃない
8 プログラマ
性別 年齢 職業
28 ?

知識

機械学習には大きく分けて教師あり学習と教師なし学習があって、今回やりたいのは教師ありの方
教師ありの機械学習の手法には回帰分類があって、今回つかえばいいのは分類の方(だと思う)
回帰はデータから数値を予測、分類はデータから分類を予測するのにつかうらしい
性別、年齢からプログラマか否かを分類したいのであっているはず

環境

python 2.7.10
scikit-learn 0.19.0

scikit-learnを使ってみる

scikit-learnには教師データとなるデータセットがサンプルで用意されているみたいなのでとりあえずそれを使ってみます
スクリーンショット 2017-09-01 17.31.53.png

irisを使ってみます。アヤメという花のデータです。
流れは、特徴量のデータと対になるアヤメの品種のデータを学習させて、
特徴量を与えると分類(品種)を予測してくれたらとりあえず目標達成です

learn_iris.py
from sklearn import datasets
# サンプルデータ読み込み
iris = datasets.load_iris()

iris.dataが特徴量のサンプルデータ
iris.targetが分類のデータです

>>> iris.data  # 特徴量のデータ Sepal(がく片), Petal(花弁)の幅, Petal(花弁)の長さ
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2],
       ...,
       [ 5.9,  3. ,  5.1,  1.8]])

>>> iris.target  # 特徴量と対になる品種のデータ(アヤメの種類) 0:"setosa”, 1:“versicolor”, 2:“virginica”
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

fitメソッドで学習をしてくれます
predictメソッドで特徴量を与えると種類を予測してくれます

svm.SVC()は何してるかわかりません。
サポートベクターマシンと呼ばれる教師あり学習の学習モデルらしいです。

今回は、setosaの特徴量を与えてちゃんと分類してくれるか試します

learn_iris.py
from sklearn import datasets
# サンプルデータ読み込み
iris = datasets.load_iris()

# 学習
clf = svm.SVC()
clf.fit(iris.data, iris.target)

# setosaの特徴量を与えてちゃんと分類してくれるか試します
test_data = [[ 5.1,  3.5,  1.4,  0.2]]
print(clf.predict(test_data))
結果
[0]

無事分類してくれました!

遊んでみる

冒頭の表を元に教師データを作成して、28歳の女性がプログラマかどうか推定してもらいます

learn_pg.py
from sklearn import datasets, svm
# 特徴量のデータ [0:男1:女, 年齢]
feature = [
    [0, 28],
    [1, 20],
    [0, 32],
    [0, 67],
    [1, 8]
]
# 正解のデータ 0:プログラマじゃない 1:プログラマ
job = [1, 0, 1, 0, 1]

# 予測させるデータ 女28歳
test_data = [[1, 28]]

# 学習
clf = svm.SVC()
clf.fit(feature, job)

print("プログラマ" if clf.predict(test_data)[0] else "プログラマじゃない")
結果
プログラマ

プログラマらしいです!
学習モデルを選べてモデル毎の正解率みたいなものも分かるらしいのですが、とりあえず今回はここまでで終わりにします。
pythonの知識も機械学習の知識も無い人間にでも、なんちゃって機械学習ができました。