【问题标题】:How to improve the knn model?如何改进knn模型?
【发布时间】:2022-12-03 21:24:54
【问题描述】:

我建立了一个用于分类的 knn 模型。不幸的是,我的模型准确率 > 80%,我想得到更好的结果。我可以问一些提示吗?也许我使用了太多预测器?

我的数据 = https://www.openml.org/search?type=data&sort=runs&id=53&status=active

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, accuracy_score, f1_score
from sklearn.model_selection import GridSearchCV

heart_disease = pd.read_csv('heart_disease.csv', sep=';', decimal=',')
y = heart_disease['heart_disease']
X = heart_disease.drop(["heart_disease"], axis=1)

correlation_matrix = heart_disease.corr()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=123)

scaler = MinMaxScaler(feature_range=(-1,1))

X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

knn_3 = KNeighborsClassifier(3, n_jobs = -1)
knn_3.fit(X_train, y_train)
y_train_pred = knn_3.predict(X_train)
labels = ['0', '1']

print('Training set')
print(pd.DataFrame(confusion_matrix(y_train, y_train_pred), index = labels, columns = labels))
print(accuracy_score(y_train, y_train_pred))
print(f1_score(y_train, y_train_pred))

y_test_pred = knn_3.predict(X_test)

print('Test set')
print(pd.DataFrame(confusion_matrix(y_test, y_test_pred), index = labels, columns = labels))
print(accuracy_score(y_test, y_test_pred))
print(f1_score(y_test, y_test_pred))

hyperparameters = {'n_neighbors' : range(1, 15), 'weights': ['uniform','distance']}

knn_best = GridSearchCV(KNeighborsClassifier(), hyperparameters, n_jobs = -1, error_score = 'raise')
knn_best.fit(X_train,y_train)
knn_best.best_params_

y_train_pred_best = knn_best.predict(X_train)
y_test_pred_best = knn_best.predict(X_test)

print('Training set')
print(pd.DataFrame(confusion_matrix(y_train, y_train_pred_best), index = labels, columns = labels))
print(accuracy_score(y_train, y_train_pred_best))
print(f1_score(y_train, y_train_pred_best))

print('Test set')
print(pd.DataFrame(confusion_matrix(y_test, y_test_pred_best), index = labels, columns = labels))
print(accuracy_score(y_test, y_test_pred_best))
print(f1_score(y_test, y_test_pred_best))

【问题讨论】:

    标签: python machine-learning scikit-learn knn


    【解决方案1】:

    您可以尝试一些方法来提高 KNN 模型的准确性。

    首先,你可以试试调整超参数您的模型,例如要考虑的最近邻居的数量或用于衡量点之间相似性的距离度量。

    要调整 KNN 模型的超参数,您可以使用类似的技术网格搜索或者交叉验证尝试超参数的不同组合并找到最适合您的数据的组合。

    你也可以试试预处理您的数据,使其更适合 KNN。例如,您可以尝试使用诸如主成分分析(PCA)。这有助于消除数据中的冗余并减少维数,从而使 KNN 更容易找到最近的邻居。

    此外,您可以尝试使用不同的分类算法总而言之,例如逻辑回归或决策树。这些算法可能更适合您的数据,并可能产生比 KNN 更好的结果。

    您可以尝试的另一件事是使用集成方法,例如 bagging 或 boosting,以组合多个 KNN 模型并可能提高其准确性。集成方法可以有效减少过度拟合并提高模型的通用性。

    【讨论】:

      【解决方案2】:

      只是答案的一小部分,找到 k_neighbors 的最佳数字。

      errlist = [] #an error list to append
      for i in range(1,40): #from 0-40 numbers to use in k_neighbors
          knn_i = KNeighborsClassifier(k_neighbors=i)
          knn_i.fit(X_train,y_train)
          errlist.append(np.mean(knn_i.predict(X_test)!=y_test)) # append the mean of failed-predict numbers
      

      绘制一条线以查看最佳 k_neighbors:

      plt.plot(range(1,40),errlist)
      

      随意更改范围的数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-29
        • 2020-05-24
        • 2021-08-01
        • 1970-01-01
        • 2018-11-10
        • 2020-07-16
        • 2019-10-07
        • 1970-01-01
        相关资源
        最近更新 更多