題目
取 Iris 花 petal 花瓣的 width 和 height 作為資料集,用 Unsupervised 的方法將其做分類,然後與其 target 的值做對比,以檢驗分類的結果是否正確。
解題
引入需要的包和資料集
import pandas as pd
from sklearn import datasets
// 引入 iris 資料
iris = datasets.load_iris()
// 檢視 Iris 的屬性
dir(iris)
// 輸出
['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']
把 iris 資料轉為 dataframe
df = pd.DataFrame(iris.data, columns = iris.feature_names)
df.head()
輸出:
去掉不需要的欄位
df.drop(['sepal length (cm)', 'sepal width (cm)'], axis='columns', inplace=True)
df.head()
輸出:
以圖表的形式輸出目標資料集
from matplotlib import pyplot as plt
plt.scatter(df['petal length (cm)'], df['petal width (cm)'])
輸出:
求出最佳 K 值
from sklearn.cluster import KMeans
k_rng = range(1, 10)
sse = []
for k in k_rng:
km = KMeans(n_clusters=k)
km.fit_predict(df[['petal width (cm)', 'petal length (cm)']])
sse.append(km.inertia_)
sse
// 輸出
[550.8953333333334,
86.39021984551397,
31.371358974358973,
19.48300089968511,
13.916908757908757,
11.03633387775173,
9.191170634920635,
7.672362403043182,
6.456494541406307]
plt.xlabel('K')
plt.ylabel('SEE')
plt.plot(k_rng, sse)
輸出:
通過上面的分析,將資料集分成 3 份
km = KMeans(n_clusters=3)
km
// 輸出
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=3, n_init=10, n_jobs=None, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
cluster = km.fit_predict(df[['petal width (cm)', 'petal length (cm)']])
df['cluster'] = cluster
df.head()
輸出:
df1 = df[df.cluster == 0]
df2 = df[df.cluster == 1]
df3 = df[df.cluster == 2]
plt.scatter(df1['petal length (cm)'], df1['petal width (cm)'], color = 'red')
plt.scatter(df2['petal length (cm)'], df2['petal width (cm)'], color = 'blue')
plt.scatter(df3['petal length (cm)'], df3['petal width (cm)'], color = 'green')
輸出:
與資料集原本的 target 對比,檢視分類是否正確
df_new = pd.DataFrame(iris.data, columns = iris.feature_names)
df_new['target'] = iris.target
df_new.drop(['sepal length (cm)', 'sepal width (cm)'], axis = 'columns', inplace=True)
df_new.head()
輸出
df_new1 = df_new[df_new.target == 0]
df_new2 = df_new[df_new.target == 1]
df_new3 = df_new[df_new.target == 2]
plt.scatter(df_new1['petal length (cm)'], df_new1['petal width (cm)'], color='red')
plt.scatter(df_new2['petal length (cm)'], df_new2['petal width (cm)'], color='blue')
plt.scatter(df_new3['petal length (cm)'], df_new3['petal width (cm)'], color='green')
下面是用資料集原本的 target 做的分類,與我們上面用 unsupervised 的方法得到的結果是一致的:
以上,是對練習題的解題,因為上一小節已經對每步操作都做了詳細的解釋,所以這裡沒有過多重複,單純貼上解題過程,如果有不明白的,可以檢視上節的說明。