1.1 K近邻算法
如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。
1.1.1 算法原理
1.1.1.1 欧式距离
计算已知类别数据集中的点与当前点之间的距离。
按距离递增次序排序。
选取与当前点距离最小的k个点。
统计前k个点所在的类别出现的频率。
返回前k个点出现频率最高的类别作为当前点的预测分类。
1.1.2 代码实现
1.1.2.1 导包
import time
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris, fetch_20newsgroups, fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
1.1.2.2 导入数据
from sklearn.datasets import load_iris
li = load_iris()
print("数据集规模:", li.data.shape)
print("数据集特征:", li.feature_names)
print("数据集目标:", li.target_names)
1.1.2.3 数据划分
x_train, x_test, y_train, y_test = train_test_split(li.data,
li.target,
test_size=0.25,
random_state=1)
print("训练集特征值形状:", x_train.shape)
print("测试集特征值形状:", x_test.shape)
1.1.2.4 特征工程
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
1.1.2.5 模型训练
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(x_train, y_train)
y_predict = knn.predict(x_test)
print("预测值:", y_predict)
1.1.2.6 模型评估
print("准确率:", knn.score(x_test, y_test))
1.1.3 网格搜索
1.1.3.1 参数选择
param = {"n_neighbors": [3, 5, 10, 12, 15],
"weights": ['uniform', 'distance']}
1.1.3.2 交叉验证
gc = GridSearchCV(knn, param_grid=param, cv=3)
gc.fit(x_train,y_train)
print("在测试集上准确率:", gc.score(x_test, y_test))
print("交叉验证最好结果:", gc.best_score_)
print("选择最好的模型是:", gc.best_estimator_)
1.1.4 常见问题
1.1.4.1 优点
算法易于理解和实现,不需要进行复杂的参数调整。
用于多类别分类问题,并且对于类别不平衡的数据集也可以有效处理。
1.1.4.2 缺点
对于大规模数据集,计算复杂度较高。
KNN的性能很大程度上依赖于选择合适的K值,不同的K值可能导致不同的分类结果。
1.1.4.3 K值选择
在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法来选择最优的K值。
K值的减小就意味着整体模型变得复杂,容易发生过拟合。
K值的增大就意味着整体的模型变得简单。