前回:Scikit-learnで機械学習(決定木で分類する方法)
SVM(サポートベクターマシン)を使ったIrisデータの分類方法
Irisデータ
scikit-learnに付属のIris(アヤメの計測データ)を利用しています。
Irisデータは『setosa』、『versicolor』、『virginica』という3種類の品種のアヤメの”がく片 (Sepal)”と”花弁 (Petal)” の幅および長さを150点計測したデータです。
sepal length(cm) | がく片の長さ |
---|---|
sepal width(cm) | がく片の幅 |
petal length(cm) | 花弁の長さ |
petal width(cm) | 花弁の幅 |
Scikit-learn SVMでIrisデータを識別(データを確認しながら実行)
- データセットの読み込みとKeys確認 [1,2]
- 特徴データをPandasデータフレームに格納して内容確認 [3,4]
- ターゲット(正解ラベル)の確認 [5,6]
- Matplotlibでデータ可視化(かく片と花びらの長さでプロット) [7]
- 訓練データとテストデータに分割 、件数確認 [8,9]
- モデルの作成と訓練データで学習 [10]
- テストデータで予測 [11]
- テストデータの分類結果と正解率の確認 [12,13]
- テストデータの分類結果をMatplotlibで可視化 [14,15]
# irisデータ読み込み
from sklearn import datasets
iris = datasets.load_iris()
# irisデータ確認
iris.keys()
import pandas as pd
iris_data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_data.head()
iris_data.describe()
iris.target
iris.target_names
# x=Sepal(がく片),y=Petal(花びら)の長さでプロット
%matplotlib inline
import matplotlib.pyplot as plt
plt.xkcd() # 手書き風グラフ
import matplotlib.pyplot as plt
features = iris.data[:, [0, 2]]
plt.figure(figsize=(5, 5))
plt.title('Iris length data (all:n=150)')
plt.xlabel('sepal length (cm)')
plt.ylabel('petal length (cm)')
plt.scatter(*features.T,
c=[['c', 'm', 'y'][x] for x in iris.target],
alpha=0.6)
# 訓練用とテスト用データに分割
from sklearn import datasets, model_selection
X_train, X_test, label_train, label_test = model_selection.train_test_split(
iris.data, iris.target, test_size=0.3, random_state=0)
# 分割後のデータ件数
print('train:', len(X_train))
print('test:', len(X_test))
# 訓練データで学習
from sklearn import svm
clf = svm.SVC() # 分類器svm
clf.fit(X_train, label_train) # 学習
# テストデータで予測
pre = clf.predict(X_test)
print('予測結果', pre)
print('正解ラベル', label_test)
from sklearn import metrics
ac_score = metrics.accuracy_score(label_test, pre)
print('正解率{0:.1f}%'.format(ac_score * 100))
%matplotlib inline
plt.xkcd() # 手書き風グラフ
import matplotlib.pyplot as plt
plt.figure(figsize=(5, 5))
features = X_test[:, [0, 2]]
plt.title('Iris length data (test:n=38)')
plt.xlabel('sepal length (cm)')
plt.ylabel('petal length (cm)')
# 予測結果プロット(n=45)
plt.scatter(*features.T,
c=[['c', 'm', 'y'][x] for x in pre],
alpha=0.6)
plt.figure(figsize=(5, 5))
features = X_test[:, [0, 2]]
plt.title('Iris length data (test:n=38)')
plt.xlabel('sepal length (cm)')
plt.ylabel('petal length (cm)')
# 予測不正解を赤でプロット(1/45)
plt.scatter(*features.T,
c=[['c', 'm', 'y'][ans] if ans == x else 'r' for ans, x in zip(label_test, pre)],
alpha=0.6)
Scikit-learn SVMでIrisデータを識別(処理まとめ)
from sklearn import datasets, model_selection , svm, metrics
# irisデータ読み込み
iris = datasets.load_iris()
# 訓練用とテスト用データに分割
X_train, X_test, label_train, label_test = model_selection.train_test_split(
iris.data, iris.target, test_size=0.3, random_state=0)
# 訓練データで学習
clf = svm.SVC() # 分類器svm
clf.fit(X_train, label_train) # 学習
# テストデータで予測
pre = clf.predict(X_test)
# 予測結果の正解率
ac_score = metrics.accuracy_score(label_test, pre)
print('正解率{0:.1f}%'.format(ac_score * 100))
0 件のコメント :
コメントを投稿