Python机器学习之KNN分类算法
KNN(K-Nearest Neighbors)是一种基本的分类算法,它的基本思想是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
本文将介绍Python实现KNN分类算法的完整攻略,包括数据预处理、模型训练和模型评估等步骤。
数据预处理
在使用KNN算法进行分类之前,需要对数据进行预处理。数据预处理包括数据清洗、数据集划分和特征归一化等步骤。
数据清洗
数据清洗是指对数据集中的异常值、缺失值和重复值等进行处理。在KNN算法中,异常值和重复值可能会影响分类结果,因此需要对其进行处理。缺失值可以通过插值等方法进行填充。
以下是Python实现数据清洗的示例代码:
import pandas as pd
# 读取数据集
data = pd.read_csv('data.csv')
# 删除重复值
data.drop_duplicates(inplace=True)
# 删除异常值
data = data[(data['age'] >= 0) & (data['age'] <= 100)]
# 填充缺失值
data.fillna(data.mean(), inplace=True)
上述代码中,使用pandas库读取数据集,然后使用drop_duplicates函数删除重复值,使用条件语句删除异常值,使用fillna函数填充缺失值。
数据集划分
数据集划分是指将数据集划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。
以下是Python实现数据集划分的示例代码:
from sklearn.model_selection import train_test_split
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(data.iloc[:, :-1], data.iloc[:, -1], test_size=0.3, random_state=42)
上述代码中,使用sklearn库的train_test_split函数将数据集划分为训练集和测试集,其中test_size参数指定测试集占总数据集的比例,random_state参数指定随机种子,保证每次划分结果一致。
特征归一化
特征归一化是指将特征值缩放到相同的范围内,避免因为特征值的大小差异导致分类结果不准确。
以下是Python实现特征归一化的示例代码:
from sklearn.preprocessing import StandardScaler
# 特征归一化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
上述代码中,使用sklearn库的StandardScaler函数对训练集和测试集进行特征归一化。
模型训练
在数据预处理完成后,可以开始训练KNN分类模型。KNN分类模型的训练过程非常简单,只需要将训练集中的特征向量和标签存储起来即可。
以下是Python实现KNN分类模型训练的示例代码:
from sklearn.neighbors import KNeighborsClassifier
# 训练模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
上述代码中,使用sklearn库的KNeighborsClassifier函数定义KNN分类模型,其中n_neighbors参数指定K值,即最近邻居的个数。然后使用fit函数对模型进行训练。
模型评估
在模型训练完成后,需要对模型进行评估。常用的评估指标包括准确率、精确率、召回率和F1值等。
以下是Python实现KNN分类模型评估的示例代码:
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 预测测试集
y_pred = knn.predict(X_test)
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# 输出评估结果
print(f"准确率:{accuracy:.2f}")
print(f"精确率:{precision:.2f}")
print(f"召回率:{recall:.2f}")
print(f"F1值:{f1:.2f}")
上述代码中,使用sklearn库的accuracy_score、precision_score、recall_score和f1_score函数计算评估指标,其中average参数指定计算方式。然后输出评估结果。
示例说明
以下是两个示例,说明如何使用KNN分类算法进行分类。
示例1
使用KNN分类算法对鸢尾花数据集进行分类。
from sklearn.datasets import load_iris
# 加载数据集
iris = load_iris()
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)
# 特征归一化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 训练模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 预测测试集
y_pred = knn.predict(X_test)
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# 输出评估结果
print(f"准确率:{accuracy:.2f}")
print(f"精确率:{precision:.2f}")
print(f"召回率:{recall:.2f}")
print(f"F1值:{f1:.2f}")
输出结果:
准确率:0.98
精确率:0.98
召回率:0.98
F1值:0.98
示例2
使用KNN分类算法对手写数字数据集进行分类。
from sklearn.datasets import load_digits
# 加载数据集
digits = load_digits()
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.3, random_state=42)
# 特征归一化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 训练模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 预测测试集
y_pred = knn.predict(X_test)
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# 输出评估结果
print(f"准确率:{accuracy:.2f}")
print(f"精确率:{precision:.2f}")
print(f"召回率:{recall:.2f}")
print(f"F1值:{f1:.2f}")
输出结果:
准确率:0.98
精确率:0.98
召回率:0.98
F1值:0.98
总结
本文介绍了Python实现KNN分类算法的完整攻略,包括数据预处理、模型训练和模型评估等步骤。KNN分类算法是一种基本的分类算法,适用于小型数据集和简单分类问题。在实际应用中,需要根据实际情况选择合适的K值和评估指标,以获得更好的性能。