Iris品種分類


分類Irs品種


scikit-learnによって提供されるデータ.scikit-learningが提供するデータは、次のリンクで見つけることができます.

Scikit-ラーニングデータセット


データの確認


scikit-learningの例示的なデータセットは、sklearnライブラリのdatasetsパケットに存在する.
from sklearn.datasets import load_iris

iris = load_iris()
iris.keys()
/------------------------------------/
# 출력
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
irisには、datatargetframetarget_namesDESCRfeature_namesの計7つの情報が含まれている.
データのサイズを決定するには、filenameを使用します.
iris_data = iris.data

print(iris_data.shape) 
/--------------------/
# 출력
(150, 4)
合計150個のデータで4個の情報が含まれていることを確認できます.
iris_data[100]
/------------/
# 출력
array([6.3, 3.3, 6. , 2.5])
各データは、.shapesepal lengthsepal widthpetal lengthの順である.この情報を用いて,機械学習モデルが花弁,萼の長さ,幅情報を入力すると,ペン花の品種が出力される.
ここで、モデルが出力する答えをラベル(label)またはターゲット(target)と呼ぶ.
ペンデータでは、ターゲット情報は、以下に示すように、petal widthと見なすことができる.
iris_label = iris.target
print(iris_label.shape)
iris_label
/----------------------/
# 출력
(150,)
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])
ラベル名はtargetと確認できます.
iris.target_names
/---------------/
# 출력
array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

データの準備

target_namesデータは2次元データなので、irisを使用してデータを準備します.
import pandas as pd
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df
/----------------------------------------------------------------/
# 출력
	sepal length (cm)	sepal width (cm)	petal length (cm)	petal width (cm)
0	5.1			3.5			1.4			0.2
1	4.9			3.0			1.4			0.2
2	4.7			3.2			1.3			0.2
3	4.6			3.1			1.5			0.2
4	5.0			3.6			1.4			0.2
...	...			...			...			...
145	6.7			3.0			5.2			2.3
146	6.3			2.5			5.0			1.9
147	6.5			3.0			5.2			2.0
148	6.2			3.4			5.4			2.3
149	5.9			3.0			5.1			1.8

150 rows × 4 columns
pandasを作成する過程で、DataFramedataを加え、各コラムはiris_dataで命名された.
また、解答データも一緒にいれば、データの扱いが便利になるので、label欄が追加されます.
iris_df["label"] = iris.target
iris_df.head()
/----------------------------/
# 출력
	sepal length (cm)	sepal width (cm)	petal length (cm)	petal width (cm)	label
0	5.1			3.5			1.4			0.2			0
1	4.9			3.0			1.4			0.2			0
2	4.7			3.2			1.3			0.2			0
3	4.6			3.1			1.5			0.2			0
4	5.0			3.6			1.4			0.2			0
  • 題:機械学習モデルに入力されたデータ.featureとも呼ばれます.変数名にはfeature_namesが使用されることが多い.
  • 答え:機械学習モデルに必要なデータ.labelまたはtargetとも呼ばれます.変数名にはXが使用されることが多い.
  • 次に、学習に必要なトレーニングデータセットとパフォーマンスを評価するために必要なテストデータセットについて議論します.
    scikit−learneはyによって簡単に分離することができる.
    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(iris_data, 
                                                        iris_label, 
                                                        test_size=0.2, 
                                                        random_state=7)
    
    print('X_train 개수: ', len(X_train),', X_test 개수: ', len(X_test))
    /-----------------------------------------------------------------/
    # 출력
    X_train 개수:  120 , X_test 개수:  30
    train_test_splitは、random_stateおよびtrainを分離する際に適用されるランダム性を決定する.既存のデータに従って分離すると、ラベルが順番に適用され、学習が正常に行われないため、データを分離する際にランダムに混合するプロセスが必要になります.
    分離したデータを出力します.
    y_train, y_test
    /-------------/
    # 출력
    (array([2, 1, 0, 2, 1, 0, 0, 0, 0, 2, 2, 1, 2, 2, 1, 0, 1, 1, 2, 0, 0, 0,
            2, 0, 2, 1, 1, 1, 0, 0, 0, 1, 2, 1, 1, 0, 2, 0, 0, 2, 2, 0, 2, 0,
            1, 2, 1, 0, 1, 0, 2, 2, 1, 0, 0, 1, 2, 0, 2, 2, 1, 0, 1, 0, 2, 2,
            0, 0, 2, 1, 2, 2, 1, 0, 0, 2, 0, 0, 1, 2, 2, 1, 1, 0, 2, 0, 0, 1,
            1, 2, 0, 1, 1, 2, 2, 1, 2, 0, 1, 1, 0, 0, 0, 1, 1, 0, 2, 2, 1, 2,
            0, 2, 1, 1, 0, 2, 1, 2, 1, 0]),
     array([2, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 1, 0, 2, 0, 1, 2, 2, 0, 0, 1, 2,
            1, 2, 2, 2, 1, 1, 2, 2]))
    testがランダムに混ざっていることが確認できます.

    学習モデル


    分類モデルの基本決定ツリーを使用します.
    from sklearn.tree import DecisionTreeClassifier
    
    decision_tree = DecisionTreeClassifier(random_state=32)
    
    decision_tree.fit(X_train, y_train)
    /-----------------------------------------------------/
    # 출력
    DecisionTreeClassifier(random_state=32)

    モデル評価

    y_pred = decision_tree.predict(X_test)
    y_pred
    /------------------------------------/
    # 출력
    array([2, 1, 0, 1, 2, 0, 1, 1, 0, 1, 2, 1, 0, 2, 0, 2, 2, 2, 0, 0, 1, 2,
           1, 1, 2, 2, 1, 1, 2, 2])
    予測データと正解データを比較し、精度を測定する.
    from sklearn.metrics import accuracy_score
    
    accuracy = accuracy_score(y_test, y_pred)
    accuracy
    /----------------------------------------/
    # 출력
    0.9
    精度は、総数の対の個数の数値を表します.