機械学習用ライブラリsklearnから必要なデータと関数をインポートします
Numpyもインポートしておきます
from sklearn import datasets, svm
import numpy as np
データ解析用ライブラリpandasを用いて、アヤメの学習用サンプルデータをロードします
import pandas as pd
dat=pd.read_csv("/content/iris0.csv") #, encoding="SHIFT-JIS")#"utf-8-sig")
dat
ロードしたアヤメのデータから,入力に対応するX(特徴量)と,出力に対応するy(クラスラベル)を取り出します.
まずXを取り出します.以下の3つの方法ではどれも同じ結果が得られます.
X=dat.iloc[:,[0,1,2,3]].values
#X(特徴量)として使う変量を取り出します.
#最後の"values"で,データを数値として扱えるようにします.
X=dat.iloc[:,:4].values
#X(特徴量)として使う変量を取り出します.
#最後の"values"で,データを数値として扱えるようにします.
X=dat.loc[:,['がく片の長さ(cm)', 'がく片の幅(cm)', '花びらの長さ(cm)', '花びらの幅(cm)']].values
#X(特徴量)として使う変量を取り出します.
#最後の"values"で,データを数値として扱えるようにします.
変数Xのデータのタイプを確認します
type(X)
Xのデータの形を確認します
X.shape
Xの0番データを見てみます→ 4つの数字のセット(=ベクトル)であることがわかります
X[0]
Xの変量名を,「variables」という変数で保存します.
variables=dat.columns[:4]
print(variables)
Xの4つのデータはアヤメの[がく片の長さ(cm),がく片の幅(cm),花びらの長さ(cm),花びらの幅(cm)]です
次にターゲットyにあたるデータを取り出します.
yはアヤメの種類を表す数字で、アヤメの種類は0, 1, 2の数字で表されています。
各々の番号が下記のようなアヤメの種類に対応します.
0: 'セトーサ'
1: 'バーシーカラー'
2: 'バージニカ'
yの数字を取り出します。以下の2つの方法ではどれも同じ結果が得られます.
y=dat.iloc[:,4].values
y=dat.loc[:,"アヤメの種類"].values
yのデータの形を確認します.
y.shape
yのデータを見てみます
y
yのクラスラベル名を,labelという変数名で保存します.
label=np.array(["セトーサ","バーシーカラー","バージニカ"])
print(label)
ここまで用意した変数まとめ:
特徴量X(入力)は各アヤメの[がく片の長さ(cm),がく片の幅(cm),花弁の長さ(cm),花弁の幅幅(cm)]の4つの数字(ベクトル)、
クラスy(出力)は対応するアヤメの名前['セトーサ' 'バーシーカラー' 'バージニカ']を表す数字[0,1,2]です
sklearnの関数を用いて,Xからyを得る関数を機械学習で生成します
clf=svm.SVC(C=1.0,kernel='linear')
clf.fit(X,y)
機械学習で得られた関数にXを代入して、学習結果を確認します.
result=clf.predict(X)
result #学習の結果得られた関数にXを入力した場合の出力(学習結果)です
答え合わせをしてみます
result==y
正解率を求めてみます
print('正解率')
success=sum(result==y)
print(100.0*success/len(y))#X,yの分割の仕方により結果は変わる
視覚化に必要なライブラリと日本語を扱うためのライブラリをインポートします.
import matplotlib.pyplot as plt
!pip install japanize-matplotlib
import japanize_matplotlib
2変量のプロット(散布図)を描いてみます
####1変量目,2変量目の散布図
#青:セトーサ(0), オレンジ:バーシーカラー(1), 緑:バージニカ(2)
cmap = plt.get_cmap("tab10")#ここでカラーマップ(使用する色のパレットのようなもの)を指定
plt.scatter(X[:,0],X[:,1],c=cmap(y))#ラベルで色分け
plt.xlabel(variables[0])
plt.ylabel(variables[1])
####3変量目,4変量目の散布図.1,2変量目よりはクラスが分かれている
plt.scatter(X[:,2],X[:,3],c=cmap(y))
plt.xlabel(variables[2])
plt.ylabel(variables[3])
散布図行列は,各変量のクラス毎の分布図, 変量の全ての組み合わせの散布図をまとめてplotすることができます.
import seaborn as sns
sns.pairplot(dat,hue="アヤメの種類",palette="tab10")#hueで,色分けするクラス情報のある変量を指定しています
イメージを掴むため,3,4番目の変量(花びらの長さ・幅)のみから'バーシーカラー'と'バージニカ'を判別する分類器を作成してみましょう.
print(label)
print(variables)
y,Xからそれぞれyのクラスが1,2である(クラスがクラスが0以外である)アヤメの情報を取り出し、
かつXからは3,4番目の変量のみを取り出し,それぞれの結果をy2とX2として保存します.
##############3,4変量,versicolorとvirginicaのみ###########
y2=y[y!=0] #クラス番号が0(セトーサ)のy以外を取り出し,y2として保存
X2=X[y!=0] #Xからクラス番号が0(セトーサ)のX以外を取り出し,X2として保存
X2=X2[:,(2,3)] #さらにXから3,4変量目のみを取り出す
x_variable=variables[2]
y_variable=variables[3]
X2.shape #X2の大きさを確認
y2.shape #y2の大きさを確認
sklearnの関数を用いて,X2からy2を得る関数を機械学習で生成します
clf=svm.SVC(C=1.0,kernel='linear')
clf.fit(X2,y2)
機械学習で得られた関数にテストデータのXを代入して、学習結果を確認します
result=clf.predict(X2)
print(result)
答え合わせをしてみます
result==y2
print('正解率')
success=sum(result==y2)
print(100.0*success/len(y2))
パラメータwの推定結果(→境界線のパラメータ)を確認します
print(clf.coef_)#w1,w2に対応
print(clf.intercept_)#w0に対応
推定した境界線を,散布図と共に図示してみましょう
######結果
plt.scatter(X2[:,0],X2[:,1],c=cmap(y2))#まず散布図表示
plt.xlabel(x_variable)
plt.ylabel(y_variable)
##境界線をplotするため,境界線の横軸(x1),縦軸(x2)に対応する座標を計算
x1 = np.arange(np.min(X2[:,0]),np.max(X2[:,0]),(np.max(X2[:,0]) - np.min(X2[:,0]))/10)#境界線をplotするx1軸の範囲指定
x2 = -(x1*clf.coef_[0][0]+clf.intercept_)/clf.coef_[0][1]#x1に対応するx2の座標
plt.plot(x1,x2,"r-")#(x1,x2)の座標点を表示し,線で繋ぐ