Fisher の有名な「あやめ」(iris、アイリス)のデータをプロットしてみます。データは Seaborn にも入っていますが、ここでは後で scikit-learn を使うので、そちらからロードします:
from sklearn.datasets import load_iris iris = load_iris()
ざっとプロットしてみます:
import matplotlib.pyplot as plt plt.scatter(iris.data[:,0], iris.data[:,1], c=iris.target)
もっと丁寧に:
markers = ['o', '^', 'v'] for i in range(3): d = iris.data[iris.target == i, :] plt.plot(d[:,0], d[:,1], 'o', fillstyle='none', marker=markers[i]) plt.xlabel('sepal length (cm)') plt.ylabel('sepal width (cm)') plt.legend(iris.target_names)
印刷用には 'o'
を 'ko'
にすれば黒になります。
主成分分析(PCA)で2次元にしてからプロットしてみます:
from sklearn.decomposition import PCA x = PCA(n_components=2).fit_transform(iris.data) for i in range(3): d = x[iris.target == i, :] plt.plot(d[:,0], d[:,1], 'o', fillstyle='none', marker=markers[i]) plt.xlabel('1st') plt.ylabel('2nd') plt.legend(iris.target_names)
次のようにすれば主成分ごとの分散の割合がわかります:
pca = PCA(n_components=2) x = pca.fit_transform(iris.data) pca.explained_variance_ratio_
出力は array([0.92461872, 0.05306648])
のようになります。第1主成分92%、第2主成分5%ほどの寄与があります。
PCAする前に変数ごとに標準化するか、あるいはここの「Scaling vs Whitening」にあるように PCA(n_components=2, whiten=True)
するといいかもしれません。標準化は次のようにします:
from sklearn import preprocessing t = preprocessing.scale(iris.data) x = PCA(n_components=2).fit_transform(t)
3次元ならどうなるでしょうか:
x = PCA(n_components=3).fit_transform(iris.data) fig, ax = plt.subplots(figsize=(10,10), subplot_kw=dict(projection="3d")) ax.scatter(x[:,0], x[:,1], x[:,2], c=iris.target) ax.set_xlabel("1st") ax.set_ylabel("2nd") ax.set_zlabel("3rd")
対話型の環境なら、マウスでぐりぐりできます。
from sklearn.tree import DecisionTreeClassifier, export_graphviz model = DecisionTreeClassifier(max_depth=3) model.fit(iris.data, iris.target) export_graphviz(model, "tree.dot", feature_names=iris.feature_names, class_names=iris.target_names)
これで tree.dot
というテキストファイルができます。これを画像に変換するには Graphviz を使います。Mac へのインストールは brew install graphviz
でできます。Graphviz の dot コマンドを使っていろいろな画像に変換できます:
dot -Tpng tree.dot -o tree.png dot -Tpdf tree.dot -o tree.pdf dot -Tsvg tree.dot -o tree.svg
Seaborn の iris データはデータフレームの形になっていますが、scikit-learn のものをデータフレームにするには次のようにする必要があります:
import pandas as pd df = pd.DataFrame(iris.data, columns=iris.feature_names) df['species'] = iris.target # または df['species'] = iris.target_names[iris.target]
次のようなことを試してみてください。
df.shape df.info() df.head() df.describe() df.isnull().sum() # 列ごとの欠測値の数を調べる df.groupby('species').size() df.corr()