KNN算法(K近邻算法)

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()