机器学习-KNN算法

1. KNN算法

"""
KNN 算法:
    解决问题:
        分类问题:
            1. 计算未知样本到每一个训练样本的距离
            2. 将训练样本根据距离大小升序排列
            3. 取出距离最近的K个训练样本
            4. 进行多数表决, 统计K个样本中那个类别的样本个数最多
            5. 将未知的样本归属到出现次数最多的类别
        回归问题:
            1. 计算未知样本到每一个训练样本的距离
            2. 将训练样本根据距离大小升序排列
            3. 取出距离最近的K个训练样本
            4. 把这个K个样本的目标值计算其平均值
            5. 将上述平均值作为将未知的样本预测的值
    算法思想:
        若一个样本在特征空间中的K个最相似的样本大多数属于某一个类别, 则该样本也属于整个类别
    相似性:
        欧氏距离
    K值的选择:
        K值过小: 过拟合
            模型更易受到异常值的影响, 更易学习到嘈杂数据
        K值过大: 欠拟合
            模型会变的相对简单, 导致最终模型的结果都是指向训练集中类别数最多的那一类
"""

2. 距离度量

"""
距离度量
    欧式距离
        d = √(x₁-x₂)² + (y₁-y₂)²
    曼哈顿距离
        d = |x₁-x₂| + |y₁-y₂|
    切比雪夫距离
        d = max(|x₁-x₂|, |y₁-y₂|)
    闵可夫斯基距离(见下图)
        当 p = 1 时 曼哈顿距离
        当 p = 2 时 欧式距离
        当 p -> oo 时 切比雪夫距离
        P 是一个变参数 根据P的不同, 闵式距离可表示某一类种的距离
"""

在这里插入图片描述

3. 特征预处理

"""
特征预处理
    特征的单位或者大小相差较大 或者 某特征的方差 相比其他的特征 要大出几个数量级, 容易影响目标结果
    
    归一化:
        通过对原始数据进行变换把数据映射到[mi, mx] 默认([0,1])之间
        如果出现异常点, 影响了最大值和最小值, 那么结果显然会发生改变
        应用场景:
            最大值与最小值非常容易受到异常点影响, 鲁棒性较差, 只适合传统精确小数据场景
    标准化:
        通过对原始数据进行标准化, 转换为均值为0, 标准差为1的标准正态分布的数据
        如果出现异常点, 由于具有一定数据量, 少量的异常点对于平均值的影响并不大
        应用场景:
            适合现代嘈杂大数据场景
"""

3.1 鸢尾花案例

"""
1. 鸢尾花数据集下载和使用
    加载数据集mydataset= load_iris()
    数据集属性dataset.data.target .target_names.feature_names.DESCR
    
2. 案例的总体处理流程    
    1. 获取数据集
    2. 数据基本处理
    3. 特征工程
    4. 机器学习(模型训练)
    5. 模型评估
    
3. 使用可视化加载和探索数据, 以确定特征是否能将不同类别分开
4. 通过标准化特征, 并随机抽样到训练集和测试集来准备数据
5. 通过统计学, 利用准确率评估机器学习模型
"""
# 1.导入工具包
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler

# 2.加载数据集
# 2.1 加载数据集
iris_data = load_iris()
# 2.2 展示数据集
# print(iris_data.data[:5])
# print(iris_data.target[:5])
# print(iris_data.feature_names)
# print(iris_data.DESCR)
iris_df = pd.DataFrame(iris_data['data'], columns=iris_data.feature_names)
iris_df['label'] = iris_data.target

sns.lmplot(x='sepal length (cm)', y='petal length (cm)', data=iris_df, hue='label', fit_reg=False)
plt.show()

# 3.特征工程(预处理-标准化)
# 3.1 数据集划分
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, train_size=0.8, random_state=2)

# 3.2 标准化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# 4.模型训练
# 4.1 实例化
knn_model = KNeighborsClassifier()
# 4.2 调用fit法
knn_model.fit(x_train, y_train)

# 5.模型预测
y_pred = knn_model.predict(x_test)

# 6.模型评估(准确率)
# 6.1 使用预测结果
# score()函数 底层 调用 accuracy_score()函数
knn_score = knn_model.score(x_test, y_test)
print(knn_score)
# 6.2 直接计算准确率
acc_score = accuracy_score(y_test, y_pred)
print(acc_score)

4. 交叉验证 与 网格搜索

"""
交叉验证
    是一种数据集的分割方法, 将训练集划分为n份, 拿一份做验证集(测试集)
    其他n-1份做训练集
    原理:
        1.第一次:把第一份数据做验证集, 其他数据做训练
        2.第二次:把第二份数据做验证集, 其他数据做训练
        3.... 以此类推, 总共训练4次, 评估4次 
        4.使用训练集+验证集多次评估模型, 取平均值做交叉验证为模型得分
        5.若k=5模型得分最好, 再使用全部数据集(训练集+验证集)对k=5模型
            再训练一边, 再使用测试集对k=5模型做评估

网格搜索
    模型有很多超参数, 其能力也存在很大的差异 需要手动产生很多超参数组合, 来训练模型
    每组超参数都采用交叉验证评估, 最后选出最优参数组合建立模型
    
    网格搜索是模型调参的有力工具
    只需要将若干参数传递给网格搜索对象, 它自动帮我们完成不同超参数的组合、模型训练、模型评估, 最终返回一组最优的超参数
    
网格搜索+ 交叉验证的强力组合(模型选择和调优)
    交叉验证解决模型的数据输入问题(数据集划分)得到更可靠的模型
    网格搜索解决超参数的组合
    两个组合再一起形成一个模型参数调优的解决方案
"""
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值