- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- 機械学習/Pythonで決定木を使う へ行く。
- 1 (2017-08-21 (月) 13:16:16)
- 2 (2017-08-21 (月) 13:59:48)
- 3 (2017-08-22 (火) 00:46:39)
- 4 (2017-08-22 (火) 07:20:39)
- 5 (2017-08-22 (火) 11:50:16)
- 6 (2017-08-23 (水) 12:35:44)
- 7 (2017-08-25 (金) 13:49:18)
- 8 (2017-08-29 (火) 11:42:06)
- 9 (2017-09-06 (水) 20:05:52)
- 10 (2017-09-06 (水) 20:05:52)
- 11 (2017-09-06 (水) 20:05:52)
はじめに †
ここでは、Pythonのデータ分析ライブラリーであるpandas、機械学習ライブラリーであるscikit-learn、実行環境であるJupyter Notebookを用いて、決定木による分類を行います。
分類とは、答えがある機械学習である教師付き機械学習のうち、答えがカテゴリー、ラベル、クラスと行った離散値であるもののことです。
以下の環境で確認しました。
- Python 3.5.1
- pandas 0.20.2
- NumPy 1.13.0
- scikit-learn 0.18.1
- Jupyter Notebook 5.0.0
- IPython 6.1.0
データ †
ここでは、irisデータをサンプルとして用います。
このデータセットは,アヤメの種類(class)を花びらの長さ(sepal length),幅(sepal width),がくの長さ(petal length),幅(petal width)によって分類する問題です. 長さと幅は連続値,種類はIris-setosa, Iris-versicolor, Iris-virginicaのいずれかをとる離散値です.
DeepAnalyticsのフォーマットに倣って、訓練データを train.tsv、テストデータを test_X.tsvとして、タブ区切りのCSVファイルで保存されているものとします。
今回のサンプルファイルはこれです。
train.tsv †
train.tsvはこんな感じです。
id | sepal lentgh | sepal width | petal length | petal width | class |
2 | 4.9 | 3 | 1.4 | 0.2 | Iris-setosa |
52 | 6.4 | 3.2 | 4.5 | 1.5 | Iris-versicolor |
101 | 6.3 | 3.3 | 6 | 2.5 | Iris-virginica |
... | ... | ... | ... | ... | ... |
test_X.tsv †
test_X.tsvはこんな感じです。
id | sepal length | sepal width | petal length | petal width |
1 | 5.1 | 3.5 | 1.4 | 0.2 |
51 | 7 | 3.2 | 4.7 | 1.4 |
103 | 7.1 | 3 | 5.9 | 2.1 |
... | ... | ... | ... | ... |
データの読み込み †
pandasのread_csvを使って、タブ区切りのCSVファイルを読み込みます。 タブ区切りなのでdelimiterオプションを、先頭の列がインデックスなのでindex_colオプションを指定します。
import pandas as pd df_iris_train = pd.read_csv('train.tsv', delimiter='\t', index_col=0) df_iris_test = pd.read_csv('test_X.tsv', delimiter='\t', index_col=0)
読み込んだデータは、pandasのDataFrameとなります。 次のようにすると、Jupyter Notebook上でDataFrameを確認できます。
df_iris_train
df_iris_test
決定木の学習 †
まず、訓練データから、入力Xと出力yをNumPy.Arrayで取り出します。
X = df_iris_train.drop('class', axis=1).values y = df_iris_train['class'].values
dropはDataFrameから行または列を取り除きます(axisオプションで行か列かを指定します)。 valuesはDataFrameをNumPy.Arrayに変換します。
Scikit-learnで決定木学習を使うには、sklearn.tree.DecisionTreeClassifierクラスを使います。 fitでモデル(ここでは決定木)を学習します。
from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier() clf.fit(X, y)
学習したモデルのスコアを確認します。 sklearn.tree.DecisionTreeClassifierのスコアは、正解率 (mean accuracy) です。
clf.score(X, y)
学習した決定木による予測 †
まず、テストデータの入力XをNumPy.Array形式に変換します。
$ conda install pydotplus
ここでは、訓練データの入力Xを上書きしていますので、注意しましょう。
predictメソッドで学習したモデルに基づいてラベルを予測します。
import pydotplus from IPython.display import Image from sklearn.externals.six import StringIO from sklearn.tree import export_graphviz dot = StringIO() export_graphviz(clf, out_file=dot, feature_names=df_iris_test.columns, class_names=df_iris_train['class'].unique(), filled=True, rounded=True,) graph = pydotplus.graph_from_dot_data(dot.getvalue()) Image(graph.create_png())
予測したラベルの出力 †
予測したラベルを、タブ区切りのCSV形式で出力します。 このとき、テストデータを参照してインデックスとします。
X = df_iris_test.values