機械学習/Pythonで決定木を使う のバックアップ差分(No.4)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
*はじめに [#qa786736]
このページはまだ書きかけです。

ここでは、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


*データ [#fa7b2541]
ここでは、irisデータをサンプルとして用います。

このデータセットは,アヤメの種類(class)を花びらの長さ(sepal length),幅(sepal width),がくの長さ(petal length),幅(petal width)によって分類する問題です. 長さと幅は連続値,種類はIris-setosa, Iris-versicolor, Iris-virginicaのいずれかをとる離散値です.

DeepAnalyticsのフォーマットに倣って、訓練データを train.tsv、テストデータを test_X.tsvとして、タブ区切りのCSVファイルで保存されているものとします。

今回のサンプルファイルはこれです。
-&ref(./train.tsv);
-&ref(./test_X.tsv);

**train.tsv [#gee0ea9e]
train.tsvはこんな感じです。
|id|sepal lentgh|sepal width|petal length|petal width|class|h
|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 [#sa17a203]
test_X.tsvはこんな感じです。
|id|sepal length|sepal width|petal length|petal width|h
|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|
|...|...|...|...|...|





*データの読み込み [#x9791a6c]
pandasのread_csvを使って、タブ区切りのCSVファイルを読み込みます。
タブ区切りなのでdelimiterオプションを、先頭の列がインデックスなのでindex_colオプションを指定します。
#geshi(python){{
import pandas as pd
df_iris_train = pd.read_csv('/Users/tohgoroh/Downloads/train.tsv',
                    delimiter='\t', index_col=0)
df_iris_test  = pd.read_csv('/Users/tohgoroh/Downloads/test_X.tsv',
                    delimiter='\t', index_col=0)
}}

読み込んだデータは、pandasのDataFrameとなります。
次のようにすると、Jupyter Notebook上でDataFrameを確認できます。
#geshi(python){{
df_iris_train
}}
#geshi(python){{
df_iris_test
}}


*決定木の学習 [#eec03914]
まず、訓練データから、入力Xと出力yをNumPy.Arrayで取り出します。
#geshi(python){{
X = df_iris_train.drop('class', axis=1).values
y = np.array(list(df_iris_train['class']))
}}
dropはDataFrameから行または列を取り除きます(axisオプションで行か列かを指定します)。
valuesはDataFrameをNumPy.Arrayに変換します。

Scikit-learnで決定木学習を使うには、sklearn.tree.DecisionTreeClassifierクラスを使います。
fitでモデル(ここでは決定木)を学習します。
#geshi(python){{
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf.fit(X, y)
}}

学習したモデルのスコアを確認します。
sklearn.tree.DecisionTreeClassifierのスコアは、正解率 (mean accuracy) です。
#geshi(python){{
clf.score(X, y)
}}


*学習した決定木による予測 [#s3f9c91b]
まず、テストデータの入力XをNumPy.Array形式に変換します。
#geshi(python){{
X = df_iris_test.values
}}
ここでは、訓練データの入力Xを上書きしていますので、注意しましょう。

predictメソッドで学習したモデルに基づいてラベルを予測します。
#geshi(python){{
p = clf.predict(X)
}}


*予測したラベルの出力 [#d7a5ac0c]
予測したラベルを、タブ区切りのCSV形式で出力します。
このとき、テストデータを参照してインデックスとします。
#geshi(python){{
pd.DataFrame(p, index=df_iris_test.index).to_csv(
        '/Users/tohgoroh/Downloads/predict.csv', header=False)
}}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS