Fisher の有名な「あやめ」のデータをプロットしてみます。まず,データをロードします:
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)
もっと丁寧に:
plt.clf() # クリア
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)
plt.clf()
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)
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8,6))
ax = Axes3D(fig, elev=-150, azim=110)
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
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()
Last modified: