我在使用机器学习算法kNN,而不是将数据集分为66.6%用于训练和33.4%用于测试,我需要使用以下参数进行交叉验证:K=3, 1/euclidean。
K=3 没有疑问,我只需在代码中添加:
Classifier = KNeighborsClassifier(n_neighbors=3, p=2, metric='euclidean')
问题就解决了。但我不理解的是1/euclidean,以及如何将其应用到代码中?
import pandas as pdimport timefrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.model_selection import cross_val_scorefrom sklearn import metricsdef openfile(): df = pd.read_csv('Testfile - kNN.csv') return dfdef main(): start_time = time.time() dataset = openfile() X = dataset.drop(columns=['Label']) y = dataset['Label'].values X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) Classifier = KNeighborsClassifier(n_neighbors=3, p=2, metric='euclidean') Classifier.fit(X_train, y_train) y_pred_class = Classifier.predict(X_test) score = cross_val_score(Classifier, X, y, cv=10) y_pred_prob = Classifier.predict_proba(X_test)[:, 1] print("accuracy_score:", metrics.accuracy_score(y_test, y_pred_class),'\n') print("confusion matrix") print(metrics.confusion_matrix(y_test, y_pred_class),'\n') print("Background precision score:", metrics.precision_score(y_test, y_pred_class, labels=['background'], average='micro')*100,"%") print("Botnet precision score:", metrics.precision_score(y_test, y_pred_class, labels=['bot'], average='micro')*100,"%") print("Normal precision score:", metrics.precision_score(y_test, y_pred_class, labels=['normal'], average='micro')*100,"%",'\n') print(metrics.classification_report(y_test, y_pred_class, digits=2),'\n') print(score,'\n') print(score.mean(),'\n') print("--- %s seconds ---" % (time.time() - start_time))
回答:
您可以创建自己的函数,并将其作为可调用对象传递给metric
参数。
创建如下所示的函数:
from scipy.spatial import distancedef inverse_euc(a,b): return 1/distance.euclidean(a, b)
现在将其作为callable
在您的KNN
函数中使用:
Classifier = KNeighborsClassifier(algorithm='ball_tree',n_neighbors=3, p=2, metric=inverse_euc)