K-近邻算法
1、K-近邻算法简介
1.1 定义:
就是通过你的“邻居”来判断你属于那个类别
1.2 如何计算你到你的“邻居”的距离
一般时候,都是使用欧氏距离
2、K-近邻算法API初步使用
2.1 安装scikit-learn工具
pip install -U scikit-learn
安装完了之后通过以下命令检查是否安装成功
import sklearn
2.2 sklearn优势
-
文档多且规范
-
包含的算法多
-
实现起来容易
2.3 sklearn中包含的内容
-
分类、聚类、回归
-
特征工程
-
模型选择、调优
2.4 K-近邻算法API
sklearn.neighbors.
KNeighborsClassifier(
n_neighbors
=5,algorithm='auto'
)
参数:
n_neighbors——选定参考几个邻居
algorithm——选择什么样的算法进行计算
auto——自动选择最优的算法
ball_tree——超过20维选择此算法
kd_tree——不超过20维选择此算法
brute——简单计算
2.5 机器学习中实现的过程
-
实例化一个训练模型
-
调用fit方法进行训练
-
简单示例:
from sklearn.neighbors import KNeighborsClassifier
# 获取数据
x = [[1],[2],[0],[0]]
y = [1,1,0,0]
# 机器学习
# 1、实例化一个训练模型
estimator = KNeighborsClassifier(n_neighbors=2)
# 2、调用fit方法进行训练
estimator.fit(x,y)
# 预测其他值
ret = estimator.predict([[10]])
print(ret)
3、距离度量
3.1 欧氏距离
3.2 曼哈顿距离
3.3 切比雪夫距离
3.4 闵可夫斯基距离
3.5 标准化欧氏距离
3.6 余弦距离
3.7 汉明距离
一个字符串到另一个字符串需要变换几个字母进行统计
3.8 杰卡德距离
通过交并集进行统计
3.9 马氏距离
通过样本分布进行统计
4、K值选择
-
K值过小
-
容易受到异常点的影响
-
容易发生过拟合
-
-
K值过大
-
容易受到样本均衡的问题
-
容易发生欠拟合
-
-
拓展
-
近似误差越小——容易发生过拟合————在训练集上表现好,测试集上表现不好
-
估计误差小才是真的好
-
5、Kd树
5.1 Kd树的构造
示例:给定一个二维空间数据集:T={(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构造一个Kd树。
5.2 Kd树的搜索
示例:查找点(2,4.5)
6、数据集介绍——案例:鸢尾花种类预测
6.1 获取数据集
sklearn.datasets.
获取小数据集:
sklearn.datasets.load_*
注意:该数据从本地获取
获取大数据集:
sklearn.datasets.fetch_*
注意:该数据从网上下载
此函数中有一个参数subset——表示获取到的数据集类型,默认为训练集
from sklearn.datasets import load_iris,fetch_20newsgroups
# 1、数据集获取
# 1.1 小数据集获取
# iris = load_iris()
# print(iris)
# 1.2 大数据集获取
news = fetch_20newsgroups()
print(news)
6.2 数据集返回值介绍
返回值类型是bunch——是一个字典类型
返回值的属性:
data:特征数据数组
target:标签(目标)数组
DESCR:数据描述
feature_names:特征值名
target_names:标签(目标值)名
# print("数据集中特征值为:\n",iris.data)
# print("数据集中目标值为:\n",iris["target"])
# print("数据集中特征值名字为:\n",iris.feature_names)
# print("数据集中目标值名字为:\n",iris.target_names)
# print("数据集的描述为:\n",iris.DESCR)
6.3 数据可视化
通过seaborn模块来实现——import seaborn
画图函数
seaborn.lmport()
参数:
x,y——具体的x轴、y轴数据的索引值
data——具体数据
hue——目标值是什么
fit_reg——是否进行线性拟合
from sklearn.datasets import load_iris
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
"""
对鸢尾花数据进行可视化
"""
iris = load_iris()
# 1、数据类型转换
iris_data = pd.DataFrame(data=iris.data,
columns=[iris.feature_names[0],iris.feature_names[1],
iris.feature_names[2],iris.feature_names[3]])
iris_data["target"] = iris.target
# print(iris_data)
# 2、定义画图函数
def iris_plot(data,col1,col2):
sns.lmplot(col1,col2,data=data,hue="target",fit_reg=False)
plt.title("鸢尾花数据展示",fontsize=20)
plt.xlabel(col1)
plt.ylabel(col2)
plt.show()
iris_plot(iris_data,iris.feature_names[0],iris.feature_names[3])
结果:
6.4 数据集划分
首先导入模块
from sklearn.model_selection import train_test_split
API:train_test_split()
参数:
x ——特征值
y ——目标值
test_size——测试集大小,一般为0.2-0.3
random_state——随机数种子,若此值相同,则划分的数据集中数据是一样的
返回值:顺序一定不能错
x_train , x_test , y_train , y_test——训练集特征值,测试集特征值,训练集目标值,测试集目标值
"""
数据集的划分
"""
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
# print("训练集的特征值为:\n",x_train)
# print("测试集的特征值为:\n",x_test)
# print("训练集的目标值为:\n",y_train)
# print("测试集的目标值为:\n",y_test)
6.5 特征工程——特征预处理
6.5.1 定义:
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
6.5.2 处理方法
归一化
标准化
6.5.3 API
sklearn.preprocessing
6.5.4 归一化(了解,以后不会使用)
定义:
对原始数据进行变换把数据映射到某个范围之间,默认范围为0-1
API:
sklearn.preprocessing.MinMaxScaler(feature_range=())
参数:
feature_range——指定转换范围,默认为0-1
总结:
鲁棒性比较差(容易受到异常点的影响)
只适合传统精确小数据场景
6.5.5 标准化(掌握,以后常用)
定义:
对原始数据进行变换把数据变换到均值为0,标准差为1的范围内
API:
sklearn.preprocessing.StandardScaler()
总结:
异常值影响小
适合现代嘈杂大数据场景
6.6 案例:鸢尾花种类预测--流程实现
"""
机器学习流程:
1、获取数据集
2、数据基本处理
3、特征工程
4、机器学习
5、模型评估
"""
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 1、获取数据集
iris = load_iris()
# 2、数据基本处理
# 2.1 数据分割
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
# 3、特征工程
# 3.1实例化一个转换器
transfer = StandardScaler()
# 3.2调用fit_transform方法
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 4、机器学习
# 4.1实例化一个估计器
estimator = KNeighborsClassifier(n_neighbors=5)
# 4.2 模型训练
estimator.fit(x_train,y_train)
# 5、模型评估
# 5.1输出预测值
y_pre = estimator.predict(x_test)
print("预测值为:\n",y_pre)
# 5.2输出准确率
ret = estimator.score(x_test,y_test)
print(ret)
"""
预测值为:
[0 2 1 1 1 1 1 1 1 0 2 1 2 2 0 2 1 1 1 1 0 2 0 1 1 0 1 1 2 1]
0.7666666666666667
"""
7、K-近邻算法总结
7.1 优点
-
简单有效
-
重新训练代价低
-
适合类域交叉样本
-
适合大样本自动分类
7.2 缺点
-
惰性学习
-
类别评分不是规格化
-
输出可解释性不强
-
对不均衡的样本不擅长
-
计算量较大
8、交叉验证和网格搜索
8.1 交叉验证
8.1.1 定义:
将拿到的训练数据分为训练集和验证集,分为几份就叫几折交叉验证
8.1.2 分割方式
训练集:训练集 + 验证集
测试集:测试集
8.1.3 为什么需要交叉验证
为了让被评估的模型更加准确可信
注意:交叉验证不能提高模型的准确率
8.2 网格搜索
超参数:
sklearn中需要手动指定的参数,叫做超参数
网格搜索就是把这些超参数的值通过字典的形式传递进去,然后进行选择最优值
8.3 API
sklearn.model_selection.GridSearchCV()
参数:
estimator——选择了那个训练模型,即估计器
param_grid ——需要传递的超参数的值
cv——几折交叉验证
"""调用交叉验证网格搜索模型"""
param_grid = {"n_neighbors":[1,3,5,7,9]}
estimator = GridSearchCV(estimator,param_grid=param_grid,cv=10,n_jobs=1)
笔记中的代码压缩包文件下载链接:
https://download.csdn.net/download/qq_39330829/13047468