[scikit-learn 机器学习] 3. K-近邻算法分类和回归
生活随笔
收集整理的這篇文章主要介紹了
[scikit-learn 机器学习] 3. K-近邻算法分类和回归
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. KNN模型
- 2. KNN分類
- 3. 使用sklearn KNN分類
- 4. KNN回歸
本文為 scikit-learn機器學習(第2版)學習筆記
K 近鄰法(K-Nearest Neighbor, K-NN) 常用于 搜索和推薦系統。
1. KNN模型
- 確定距離度量方法(如歐氏距離)
- 根據 K 個最近的距離的鄰居樣本,選擇策略做出預測
- 模型假設:距離相近的樣本,有接近的響應值
2. KNN分類
根據身高、體重對性別進行分類
import numpy as np import matplotlib.pyplot as pltX_train = np.array([[158, 64],[170, 86],[183, 84],[191, 80],[155, 49],[163, 59],[180, 67],[158, 54],[170, 67] ]) y_train = ['male', 'male', 'male', 'male', 'female', 'female', 'female', 'female', 'female']plt.figure() plt.title('Human Heights and Weights by Sex') plt.xlabel('Height in cm') plt.ylabel('Weight in kg')for i, x in enumerate(X_train):if y_train[i] == 'male':c1 = plt.scatter(x[0], x[1], c='k', marker='x')else:c2 = plt.scatter(x[0], x[1], c='r', marker='o') plt.grid(True) plt.legend((c1,c2),('male','female'),loc='lower right') # plt.show()- 對身高 155cm,體重 70 kg的人進行性別預測
- 設置 KNN 模型 k = 3
3. 使用sklearn KNN分類
標簽(male,female)數字化(0,1)
from sklearn.preprocessing import LabelBinarizer from sklearn.neighbors import KNeighborsClassifierlb = LabelBinarizer() y_train_lb = lb.fit_transform(y_train) y_train_lb ###### array([[1],[1],[1],[1],[0],[0],[0],[0],[0]])預測前面的例子的性別
K=3 clf = KNeighborsClassifier(n_neighbors=K) clf.fit(X_train,y_train_lb.ravel()) pred_gender = clf.predict(x) pred_gender # array([0]) pred_label_gender = lb.inverse_transform(pred_gender) pred_label_gender # array(['female'], dtype='<U6')在test集上驗證
X_test = np.array([[168, 65],[180, 96],[160, 52],[169, 67] ]) y_test = ['male', 'male', 'female', 'female'] y_test_lb = lb.transform(y_test)pred_lb = clf.predict(X_test) print('Predicted labels: %s' % lb.inverse_transform(pred_lb)) # Predicted labels: ['female' 'male' 'female' 'female']計算評價指標
準確率:預測對了的比例3/4 from sklearn.metrics import accuracy_score accuracy_score(y_test_lb, pred_lb) # 0.75 精準率:正類為男,男預測為男/(男預測男+女預測男) from sklearn.metrics import precision_score precision_score(y_test_lb, pred_lb) # 1.0 召回率: 男預測男/(男預測男+男預測女) from sklearn.metrics import recall_score recall_score(y_test_lb, pred_lb) # 0.5F1 值
F1 得分是:精準率和召回率的均衡 from sklearn.metrics import f1_score f1_score(y_test_lb, pred_lb) # 0.6667 評價報告 from sklearn.metrics import classification_report # help(classification_report) # classification_report(y_true, y_pred, labels=None, target_names=None, s # ample_weight=None, digits=2, output_dict=False, zero_division='warn') print(classification_report(y_test_lb, pred_lb, target_names=['male','female'], labels=[1,0]))4. KNN回歸
根據身高、性別,預測其體重
from sklearn.neighbors import KNeighborsRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error,r2_scoreX_train = np.array([[158, 1],[170, 1],[183, 1],[191, 1],[155, 0],[163, 0],[180, 0],[158, 0],[170, 0] ]) y_train = [64,86,84,80,49,59,67,54,67]X_test = np.array([[168, 1],[180, 1],[160, 0],[169, 0] ]) y_test = [65,96,52,67]K = 3 clf = KNeighborsRegressor(n_neighbors=K) clf.fit(X_train, y_train) predictions = clf.predict(np.array(X_test)) predictions # array([70.66666667, 79. , 59. , 70.66666667])# help(r2_score) # R^2 (coefficient of determination) r2_score(y_test, predictions) # 0.6290565226735438平均絕對值誤差 mean_absolute_error(y_test, predictions) # 8.333333333333336平均平方誤差 mean_squared_error(y_test, predictions) # 95.8888888888889- 數據沒有標準化的影響
可以看出不同單位下的歐式距離差異很大
- 進行數據標準化
- 標準化特征后 模型誤差更低
總結
以上是生活随笔為你收集整理的[scikit-learn 机器学习] 3. K-近邻算法分类和回归的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Hands On ML] 8. 降维
- 下一篇: LeetCode 1429. 第一个唯一