📜  KNN 模型复杂度

📅  最后修改于: 2022-05-13 01:55:36.795000             🧑  作者: Mango

KNN 模型复杂度

KNN 是一种机器学习算法,用于分类(使用 KNearestClassifier)和回归(使用KNearestRegressor )问题。在 KNN 算法中,K 是超参数。选择正确的 K 值很重要。如果构建的模型具有低偏差和高方差,则称机器学习模型具有高模型复杂性。

我们知道,

  1. 高偏差和低方差 = 欠拟合模型。
  2. 低偏差和高方差 = 过拟合模型。 [表示高度复杂的模型]。
  3. 低偏差和低方差 = 最佳拟合模型。 [这是首选]。
  4. 高训练准确率和低测试准确率(样本外准确率)=高方差=过拟合模型=更多模型复杂度。
  5. 低训练精度和低测试精度(样本外精度)= 高偏差 = 欠拟合模型。

代码:了解 KNN 算法中的 K 值如何影响模型复杂度。

# This code may not run on GFG ide
# As required modules are not found.
   
# Import required modules
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split
import numpy as np
   
# Synthetically Create Data Set
plt.figure()
plt.title('SIMPLE-LINEAR-REGRESSION')
x, y = make_regression(
    n_samples = 100, n_features = 1, 
    n_informative = 1, noise = 15, random_state = 3)
plt.scatter(x, y, color ='red', marker ='o', s = 30)
   
# Train the model.
knn = KNeighborsRegressor(n_neighbors = 7)
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size = 0.2, random_state = 0)
knn.fit(x_train, y_train)
predict = knn.predict(x_test)
print('Test Accuracy:', knn.score(x_test, y_test))
print('Training Accuracy:', knn.score(x_train, y_train))
   
# Plot The Output
x_new = np.linspace(-3, 2, 100).reshape(100, 1)
predict_new = knn.predict(x_new)
plt.plot(
    x_new, predict_new, color ='blue', 
    label ="K = 7")
plt.scatter(x_train, y_train, color ='red' )
plt.scatter(x_test, predict, marker ='^', s = 90)
plt.legend()

输出:

Test Accuracy: 0.6465919540035108
Training Accuracy: 0.8687977824212627

现在让我们将 K(超参数)的值从 Low 变为 High 并观察模型复杂度
K = 1


K = 10

K = 20

K = 50

K = 70

观察:

  • 当 K 值较小即 K=1 时,模型复杂度较高(过拟合或高方差)。
  • 当K值很大时,即K=70,模型复杂度降低(Under-fitting or High Bias)。

结论:
随着 K 值变小,模型复杂度增加,随着 K 值变大,模型复杂度降低。

代码:让我们考虑下图

# This code may not run on GFG
# As required modules are not found.
  
# To plot test accuracy and train accuracy Vs K value.
p = list(range(1, 31))
lst_test =[]
lst_train =[]
for i in p:
    knn = KNeighborsRegressor(n_neighbors = i)
    knn.fit(x_train, y_train)
    z = knn.score(x_test, y_test)
    t = knn.score(x_train, y_train)
    lst_test.append(z)
    lst_train.append(t)
      
plt.plot(p, lst_test, color ='red', label ='Test Accuracy')
plt.plot(p, lst_train, color ='b', label ='Train Accuracy')
plt.xlabel('K VALUES --->')
plt.title('FINDING BEST VALUE FOR K')
plt.legend()

输出:

观察:
从上图中,我们可以得出结论,当 K 较小时,即 K=1,Training Accuracy 较高但 Test Accuracy 较低,这意味着模型过拟合(High Variance 或High Model Complexity )。当 K 值较大时,即 K=50,Training Accuracy 低,Test Accuracy 低,这意味着模型欠拟合(High Bias 或 Low Model Complexity)。

所以参数调整是必要的,即在KNN算法中选择K的最佳值,模型具有低偏差和低方差,并产生具有高样本外精度的良好模型。

我们可以使用GridSearchCVRandomSearchCv来找到超参数 K 的最佳值。