K值过小:
用较小领域中的训练实例进行预测 容易受到异常点影响 过拟合
K值过大:
用较大邻域中的训练实例进行预测 K值 过大意味着整体的模型变简单,欠拟合
KNN
既能做回归也能做分类
使用欧氏距离 ,计算测试集与样本集的距离。
按照升序排列,取 距离最小的K个值
分类-->投票 回归-->算平均值
上述的结果作为-->模型的预测结果
归一化与标准化
数据提取 特征预处理->归一化,标准化(常用) 数据降维 特征选择 特征组合
归一化
鲁棒性 差
改数据特别影响模型
实现方式:
归一化:
公式:
x' = (当前值 - 该列最小值) / (该列最大值 - 该列最小值)
x'' = x' * (mx - mi) + mi
.
弊端:容易受到异常值的影响,且数据再多也是最大值与最小值计算,结果不均衡
标准化
公式: x' = (当前值 - 该列的均值) / 该列的标准差 解释: 方差: 该列值和 该列均值离差平方之和 的均值. 标准差: 标准差 = 方差 ** 0.5 方差 = (所有 (数据值 - 均值)² 的和) / 数据个数 方差开根号=标准差 均值离差 = 就是每个数据点与整体均值的差值 离差 = 该列值 - 该列平均值
正态分布
记作 μ:缪->钟的中心, σ:西格玛:钟的高低
均值越多 钟越高
正态分布图:两边低中间高
交叉验证与网格搜索
交叉验证
几折交叉验证
解决:模型的数据输入问题(数据划分) 找最优数据切分
网格搜索
解决:超参数的组合 找最优超参
estimator = KNeighborsClassifier()
param_grid = {"n_neighbors":range(1,11)}
grid_search = GridSearchCV(estimator,param_grid,cv=5)
grid_search.fit(x_train,y_train)
代码示例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import numpy as np
def dm04_iris_model():
# 1. 数据加载.
iris = load_iris()
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=55)
# 2. 特征工程.
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 3. 网格搜索 + 5折交叉验证
estimator = KNeighborsClassifier()
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
grid_search = GridSearchCV(estimator, param_grid, cv=5)
grid_search.fit(x_train, y_train)
# 4. 使用最佳模型
best_estimator = grid_search.best_estimator_
y_predict = best_estimator.predict(x_test)
# 5. 新数据预测
new_x_test = [[3.6, 2.7, 1.9, 2.8]]
new_x_test = transfer.transform(new_x_test)
new_y_predict = best_estimator.predict(new_x_test)
new_y_predict_proba = best_estimator.predict_proba(new_x_test)
# 6. 输出结果
print(f'最佳参数: {grid_search.best_params_}')
print(f'最佳分数: {grid_search.best_score_}')
print(f'测试集准确率: {accuracy_score(y_test, y_predict)}')
print(f'新数据预测结果: {new_y_predict}')
print(f'新数据预测概率: {new_y_predict_proba}')
return best_estimator, transfer
# 调用函数
if __name__ == "__main__":
dm04_iris_model()