- 🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客
- 🍖 原作者:K同学啊 | 接輔導、項目定制
一、基本概念
KNN(K-Nearest Neighbor)是最简单的机器学习算法之一,可以用于分类和回归,是一种监督学习算法。在此算法中,给定一个训练数据集,输入一个新的实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例主要是哪一类别,那么就把该实例分类到这个类中。它属于基于实例的学习(instance-based learning),属于懒惰学习(lazy learning)即KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。
二、代码实现
1. 问题简介
背景: 海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人:
- ①不喜欢的人;
- ②魅力一般的人;
- ③极具魅力的人。
她现在总结好的数据中(即训练集)包含三种特征:
- ①每年获得的飞行常客里程数
- ②玩视频游戏所耗时间百分比
- ③每周消费的冰淇淋公升数
她希望根据现有的数据来判断一个陌生男人会被她归到哪一类。
2. 导入数据集
import pandas as pd
df = pd.read_csv('datingTestSet2.txt', sep='\t', header=None)
df.head()
3. 分割数据集
# Split the data
X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=6)
print('X_train:', X_train.shape)
print('X_test:', X_test.shape)
print('y_train:', y_train.shape)
print('y_test:', y_test.shape)
4. K-邻近算法模型
此处n_neighbors的默认值为5
K值小,相当于用较小的领域中的训练实例进行预测,只要与输入实例相近的实例才会对预测结果,模型变得复杂,只要改变一点点就可能导致分类结果出错,泛化性不佳。(学习近似误差小,但是估计误差增大,过拟合)
K值大,相当于用较大的领域中的训练实例进行预测,与输入实例较远的实例也会对预测结果产生影响,模型变得简单,可能预测出错。(学习近似误差大,但是估计误差小,欠拟合)
# Train the model
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier()
classifier.fit(X_train, y_train)
5. 结果预测
# Predict the test set
y_pred = classifier.predict(X_test)
# Create a new DataFrame for the test set predictions
df_test = pd.DataFrame(X_test, columns=[f'feature_{i}' for i in range(X_test.shape[1])])
umns=[f'feature_{i}' for i in range(X_test.shape[1])])
df_test['label'] = y_test
df_test['predict'] = y_pred
df_test.head()
6. 结果评估
# Evaluate the model
score = classifier.score(X_test, y_test)
print('Score:', score)
from sklearn.metrics import confusion_matrix, accuracy_score
cm = confusion_matrix(y_test, y_pred)
accuracy = accuracy_score(y_test, y_pred)
print('Confusion Matrix:', cm)
print('Accuracy:', accuracy)