分類(Classification)指的是從數據中選出已經分好類的訓練集,在該訓練集上運用數據挖掘分類的技術建立分類模型,從而對沒有分類的數據進行分類的分析方法。
分類問題的應用場景:用于將事物打上一個標簽,通常結果為離散值。例如判斷一副圖片上的動物是一只貓還是一只狗,分類通常是建立在回歸之上。
基本的分類方法—KNN最鄰近分類算法,簡稱KNN,是最簡單的機器學習算法之一。
核心邏輯:在距離空間里,如果一個樣本的最接近的K個鄰居里,絕大多數屬于某個類別,則該樣本也屬于這個類別。
?
?
給定電影分類樣例,預測某一電影的分類。
from sklearn import neighbors #導入模塊 import warnings warnings.filterwarnings('ignore') #不發出警告 df = pd.DataFrame({'name':['北京遇上西雅圖','喜歡你','瘋狂動物城','戰狼2','力王','敢死隊'],'fight':[3,2,1,101,99,98],'kiss':[104,100,81,10,5,2],'type':['love','love','love','action','action','action']}) love = df[df['type']] == 'love'] action = df[df['type']== 'action'] plt.scatter(love['fight'],love['kiss'],color = 'red',label = 'love') # 類型為愛情的電影做紅色散點圖 plt.scatter(action['fight'],action['kiss'],color = 'green',label='action') # 類型為動作片的電影做綠色散點圖 plt.legend()knn = neighbors.KNeighborsClassifier() # 創建KNN最鄰近分類模型 knn.fit(df[['fight','kiss']],df['type']) # 給模型導入數據 k = knn.predict([[18, 90]]) # 預測數據,參數需要是二維的 print('預測電影類型為%s'%k,type(k)) # 預測電影類型為['love'],<class 'numpy.ndarray'> plt.scatter(18,90,color = 'blue',marker='x',label=k) plt.text(18,90,'《你的名字》',color='blue')
?
另外隨機生成一組數據,用上面的knn分類模型進行分類
df2 = pd.DataFrame(np.random.rand(100,2)*80,columns=['fight','kiss']) df2['predictType'] = knn.predict(df2)plt.scatter(love['fight'],love['kiss'],color = 'red',label = 'love') plt.scatter(action['fight'],action['kiss'],color = 'green',label='action') plt.legend()plt.scatter(df2[df2['predictType']=='love']['fight'],df2[df2['predictType']=='love']['kiss'],color = 'red',label = 'love',marker='x') plt.scatter(df2[df2['predictType']=='action']['fight'],df2[df2['predictType']=='action']['kiss'],color = 'green',label='action',marker='x')df2.head()
? ? ?
?
案例2:植物分類
from sklearn import datasets iris = datasets.load_iris() print(iris.data[:5]) #類型為<class 'sklearn.utils.Bunch'>,數據部分為一個二維數組 print(iris.feature_names) print(iris.target_names) # print(iris.target) #表示每一個數據所屬的分類,分類用數字表示,結果為數組# [[5.1 3.5 1.4 0.2] # [4.9 3. 1.4 0.2] # [4.7 3.2 1.3 0.2] # [4.6 3.1 1.5 0.2] # [5. 3.6 1.4 0.2]] #['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)'],表示分類特征:萼片長度、萼片寬度、花瓣長度、花瓣寬度 #['setosa' 'versicolor' 'virginica'],表示分類名稱
?
構建DataFrame方便查看數據,并使用數字分類和名稱分類分別構建模型
data = pd.DataFrame(iris.data, columns = iris.feature_names) #構建DataFrame方便查看 data['target'] = iris.target print(data.head()) print('----------------------------')d = pd.DataFrame({'target':[0, 1, 2],'target_names':iris.target_names}) print(d.head()) print('----------------------------')data = pd.merge(data,d,on='target') #最終形成的DataFrame包含四個分類特征、分類數值、分裂名稱 print(data.head()) print('----------------------------')knn1 = neighbors.KNeighborsClassifier() knn1.fit(iris.data,iris.target) #使用分類數值構建模型 t1 = knn1.predict([[0.1,0.2,0.3,0.4]]) print('所在分類(數字表示)為',t1)knn2 = neighbors.KNeighborsClassifier() knn2.fit(iris.data,data['target_names']) #使用分類名稱構建模型 t2 = knn2.predict([[0.1,0.2,0.3,0.4]]) print('所在分類(名稱表示)為',t2)
# 上述輸出結果
# sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target # 0 5.1 3.5 1.4 0.2 0 # 1 4.9 3.0 1.4 0.2 0 # 2 4.7 3.2 1.3 0.2 0 # 3 4.6 3.1 1.5 0.2 0 # 4 5.0 3.6 1.4 0.2 0 # ---------------------------- # target target_names # 0 0 setosa # 1 1 versicolor # 2 2 virginica # ---------------------------- # sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target target_names # 0 5.1 3.5 1.4 0.2 0 setosa # 1 4.9 3.0 1.4 0.2 0 setosa # 2 4.7 3.2 1.3 0.2 0 setosa # 3 4.6 3.1 1.5 0.2 0 setosa # 4 5.0 3.6 1.4 0.2 0 setosa # ---------------------------- # 所在分類(數字表示)為 [0] # 所在分類(名稱表示)為 ['setosa']
?