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. 通过统计学, 利用准确率评估机器学习模型
"""
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
iris_data = load_iris()
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()
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, train_size=0.8, random_state=2)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
knn_model = KNeighborsClassifier()
knn_model.fit(x_train, y_train)
y_pred = knn_model.predict(x_test)
knn_score = knn_model.score(x_test, y_test)
print(knn_score)
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模型做评估
网格搜索
模型有很多超参数, 其能力也存在很大的差异 需要手动产生很多超参数组合, 来训练模型
每组超参数都采用交叉验证评估, 最后选出最优参数组合建立模型
网格搜索是模型调参的有力工具
只需要将若干参数传递给网格搜索对象, 它自动帮我们完成不同超参数的组合、模型训练、模型评估, 最终返回一组最优的超参数
网格搜索+ 交叉验证的强力组合(模型选择和调优)
交叉验证解决模型的数据输入问题(数据集划分)得到更可靠的模型
网格搜索解决超参数的组合
两个组合再一起形成一个模型参数调优的解决方案
"""