機械学習/Pythonで決定木を使う
をテンプレートにして作成
開始行:
*目次 [#e6d2ad11]
#contents
*はじめに [#qa786736]
ここでは、Pythonのデータ分析ライブラリーであるpandas、機...
分類とは、答えがある機械学習である教師付き機械学習のうち...
scikit-learnに付属するデータを用いているサンプルはたくさ...
そこで、ここでは、DeepAnalyticsフォーマットのファイルを想...
この内容は、以下の環境で確認しました。
-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
-Graphviz 2.36.0
-pydotplus 2.0.2
*データ [#fa7b2541]
ここでは、irisデータをサンプルとして用います。
このデータセットは,アヤメの種類(class)を花びらの長さ(...
DeepAnalyticsのフォーマットに倣って、訓練データを train.t...
今回のサンプルファイルはこれです。
-&ref(./train.tsv);
-&ref(./test_X.tsv);
**train.tsv [#gee0ea9e]
train.tsvはこんな感じです。
|id|sepal lentgh|sepal width|petal length|petal width|cla...
|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 オプションを、先頭の列がインデ...
#geshi(python){{
import pandas as pd
df_iris_train = pd.read_csv('train.tsv', delimiter='\t',...
df_iris_test = pd.read_csv('test_X.tsv', delimiter='\t',...
}}
読み込んだデータは、pandasのDataFrameとなります。
次のようにすると、Jupyter Notebook上でDataFrameを確認でき...
#geshi(python){{
df_iris_train
}}
#geshi(python){{
df_iris_test
}}
*決定木の学習 [#eec03914]
決定木 (Decision Tree) は分類規則を木で表したものです。
実物を見た方が早いので、先に決定木の作り方から説明します。
まず、訓練データから、入力 X と出力 y をnumpy.ndarrayで取...
#geshi(python){{
X = df_iris_train.drop('class', axis=1).values
y = df_iris_train['class'].values
}}
dropはDataFrameから行または列を取り除きます(axis オプシ...
valuesはDataFrameをnumpy.ndarrayに変換します。
scikit-learnで決定木学習を使うには、sklearn.tree.Decision...
fit関数で予測モデル(ここでは決定木)を学習します。
#geshi(python){{
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X, y)
}}
ここで、clf は classifier の略です。
学習したモデルのスコアを確認します。
sklearn.tree.DecisionTreeClassifierのスコアは、正解率 (me...
#geshi(python){{
clf.score(X, y)
}}
*学習した決定木の可視化 [#fc6641eb]
可視化にはGraphvizとPythonのpydotplusパッケージを使います。
Graphvizはグラフ描画ソフトウェアで、下記のサイトからダウ...
(macOS Sierraの場合、mountainlion版のgraphviz-2.36.0.pkg...
-http://www.graphviz.org
Windowsの場合は、Graphvizを新規にインストールしたら、環境...
pydotplusパッケージがインストールされていない場合は、Anac...
#geshi(sh){{
$ conda install pydotplus
}}
インストールができたら、Jupyter Notebook上でグラフを作成...
#geshi(python){{
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())
}}
次のような決定木が表示されます。
&ref(./decision_tree_1.png,75%,nolink);
*決定木 [#b257555c]
決定木は、''節'' (node) と''枝'' (branch) から成ります。
一番上の節を''根'' (root) といいます。
根から枝が分かれて下へと伸びていきます。
先端の節を''葉'' (leaf) といいます。
節は''条件に''に対応します。
節の1行目にかかれているのが条件です。
条件が満たされるときは左の枝に、そうでないときは右の枝に...
葉にたどり着いたら、その葉が表すクラスに分類します。
節の4行目に書かれているのが、その節で分類されるクラスです。
したがって、この決定木は、以下のようなルールを表している...
-petal lengthの値が2.45以下ならば、Iris-setosa
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
決定木を学習するアルゴリズムでは、まず、条件を選びます。
説明変数が数値の場合は、訓練データに含まれている値の中か...
このとき「最もよく分割する」ことを評価する基準として、ジ...
**ジニ係数 [#rdc78438]
分類するクラスが [math]k[/math] 個のとき、クラス [math]i[...
\[ G = 1 - \sum_{i=1}^{k} P_i^2 \]
クラス [math]i[/math] に分類される確率が [math]P_i = 1[/m...
どのクラスにも均等に分類されるとき、すなわち、すべてのク...
つまり、ジニ係数が小さいほど良いです。
**情報量利得 [#c2838ec6]
分類するクラスが [math]k[/math] このとき、クラス [math]i[...
\[ H(P) = - \sum_{i=1}^{k} P_i \log P_i \]
クラス [math]i[/math] に分類される確率が [math]P_i = 1[/m...
どのクラスにも均等に分類されるとき、すなわち、すべてのク...
つまり、平均情報量も小さいほど良いです。
情報量利得は、節の条件によって分割することによって平均情...
分割後の平均情報量は、それぞれの節の平均情報量のデータ数...
*学習した決定木による予測 [#s3f9c91b]
まず、テストデータの入力Xをnumpy.ndarray形式に変換します。
#geshi(python){{
X = df_iris_test.values
}}
ここでは、訓練データの入力Xを上書きしていますので、注意し...
predictメソッドで学習したモデルに基づいてラベルを予測しま...
#geshi(python){{
p = clf.predict(X)
}}
*予測したラベルの出力 [#d7a5ac0c]
DeepAnalyticsでは、予測した結果をヘッダなしのCSV形式のフ...
そこで、予測したラベルをCSV形式で出力します。
このとき、テストデータを参照してインデックスとします。
#geshi(python){{
pd.DataFrame(p, index=df_iris_test.index).to_csv('predict...
}}
*学習パラメーター [#r3b471aa]
上の例ではデフォルトの学習パラメーターで決定木を学習しま...
-http://scikit-learn.org/dev/modules/generated/sklearn.tr...
例えば、評価基準 (criterion) を情報量利得 (entropy) に、...
#geshi(python){{
clf = DecisionTreeClassifier(criterion='entropy', max_dep...
}}
&ref(./decision_tree_2.png,75%,nolink);
irisデータでは学習パラメーターを変更してもあまり効果があ...
終了行:
*目次 [#e6d2ad11]
#contents
*はじめに [#qa786736]
ここでは、Pythonのデータ分析ライブラリーであるpandas、機...
分類とは、答えがある機械学習である教師付き機械学習のうち...
scikit-learnに付属するデータを用いているサンプルはたくさ...
そこで、ここでは、DeepAnalyticsフォーマットのファイルを想...
この内容は、以下の環境で確認しました。
-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
-Graphviz 2.36.0
-pydotplus 2.0.2
*データ [#fa7b2541]
ここでは、irisデータをサンプルとして用います。
このデータセットは,アヤメの種類(class)を花びらの長さ(...
DeepAnalyticsのフォーマットに倣って、訓練データを train.t...
今回のサンプルファイルはこれです。
-&ref(./train.tsv);
-&ref(./test_X.tsv);
**train.tsv [#gee0ea9e]
train.tsvはこんな感じです。
|id|sepal lentgh|sepal width|petal length|petal width|cla...
|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 オプションを、先頭の列がインデ...
#geshi(python){{
import pandas as pd
df_iris_train = pd.read_csv('train.tsv', delimiter='\t',...
df_iris_test = pd.read_csv('test_X.tsv', delimiter='\t',...
}}
読み込んだデータは、pandasのDataFrameとなります。
次のようにすると、Jupyter Notebook上でDataFrameを確認でき...
#geshi(python){{
df_iris_train
}}
#geshi(python){{
df_iris_test
}}
*決定木の学習 [#eec03914]
決定木 (Decision Tree) は分類規則を木で表したものです。
実物を見た方が早いので、先に決定木の作り方から説明します。
まず、訓練データから、入力 X と出力 y をnumpy.ndarrayで取...
#geshi(python){{
X = df_iris_train.drop('class', axis=1).values
y = df_iris_train['class'].values
}}
dropはDataFrameから行または列を取り除きます(axis オプシ...
valuesはDataFrameをnumpy.ndarrayに変換します。
scikit-learnで決定木学習を使うには、sklearn.tree.Decision...
fit関数で予測モデル(ここでは決定木)を学習します。
#geshi(python){{
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf.fit(X, y)
}}
ここで、clf は classifier の略です。
学習したモデルのスコアを確認します。
sklearn.tree.DecisionTreeClassifierのスコアは、正解率 (me...
#geshi(python){{
clf.score(X, y)
}}
*学習した決定木の可視化 [#fc6641eb]
可視化にはGraphvizとPythonのpydotplusパッケージを使います。
Graphvizはグラフ描画ソフトウェアで、下記のサイトからダウ...
(macOS Sierraの場合、mountainlion版のgraphviz-2.36.0.pkg...
-http://www.graphviz.org
Windowsの場合は、Graphvizを新規にインストールしたら、環境...
pydotplusパッケージがインストールされていない場合は、Anac...
#geshi(sh){{
$ conda install pydotplus
}}
インストールができたら、Jupyter Notebook上でグラフを作成...
#geshi(python){{
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())
}}
次のような決定木が表示されます。
&ref(./decision_tree_1.png,75%,nolink);
*決定木 [#b257555c]
決定木は、''節'' (node) と''枝'' (branch) から成ります。
一番上の節を''根'' (root) といいます。
根から枝が分かれて下へと伸びていきます。
先端の節を''葉'' (leaf) といいます。
節は''条件に''に対応します。
節の1行目にかかれているのが条件です。
条件が満たされるときは左の枝に、そうでないときは右の枝に...
葉にたどり着いたら、その葉が表すクラスに分類します。
節の4行目に書かれているのが、その節で分類されるクラスです。
したがって、この決定木は、以下のようなルールを表している...
-petal lengthの値が2.45以下ならば、Iris-setosa
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
-petal lengthの値が2.45より大きい、かつ、petal widthの値...
決定木を学習するアルゴリズムでは、まず、条件を選びます。
説明変数が数値の場合は、訓練データに含まれている値の中か...
このとき「最もよく分割する」ことを評価する基準として、ジ...
**ジニ係数 [#rdc78438]
分類するクラスが [math]k[/math] 個のとき、クラス [math]i[...
\[ G = 1 - \sum_{i=1}^{k} P_i^2 \]
クラス [math]i[/math] に分類される確率が [math]P_i = 1[/m...
どのクラスにも均等に分類されるとき、すなわち、すべてのク...
つまり、ジニ係数が小さいほど良いです。
**情報量利得 [#c2838ec6]
分類するクラスが [math]k[/math] このとき、クラス [math]i[...
\[ H(P) = - \sum_{i=1}^{k} P_i \log P_i \]
クラス [math]i[/math] に分類される確率が [math]P_i = 1[/m...
どのクラスにも均等に分類されるとき、すなわち、すべてのク...
つまり、平均情報量も小さいほど良いです。
情報量利得は、節の条件によって分割することによって平均情...
分割後の平均情報量は、それぞれの節の平均情報量のデータ数...
*学習した決定木による予測 [#s3f9c91b]
まず、テストデータの入力Xをnumpy.ndarray形式に変換します。
#geshi(python){{
X = df_iris_test.values
}}
ここでは、訓練データの入力Xを上書きしていますので、注意し...
predictメソッドで学習したモデルに基づいてラベルを予測しま...
#geshi(python){{
p = clf.predict(X)
}}
*予測したラベルの出力 [#d7a5ac0c]
DeepAnalyticsでは、予測した結果をヘッダなしのCSV形式のフ...
そこで、予測したラベルをCSV形式で出力します。
このとき、テストデータを参照してインデックスとします。
#geshi(python){{
pd.DataFrame(p, index=df_iris_test.index).to_csv('predict...
}}
*学習パラメーター [#r3b471aa]
上の例ではデフォルトの学習パラメーターで決定木を学習しま...
-http://scikit-learn.org/dev/modules/generated/sklearn.tr...
例えば、評価基準 (criterion) を情報量利得 (entropy) に、...
#geshi(python){{
clf = DecisionTreeClassifier(criterion='entropy', max_dep...
}}
&ref(./decision_tree_2.png,75%,nolink);
irisデータでは学習パラメーターを変更してもあまり効果があ...
ページ名: