KNN算法
KNN算法简介
KNN算法思想
K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别
KNN算法思想:如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别
样本相似性:样本都是属于一个任务数据集的。样本距离越近则越相似。
K值的选择
【知道】KNN的应用方式
-
解决问题:分类问题、回归问题
-
算法思想:若一个样本在特征空间中的 k 个最相似的样本大多数属于某一个类别,则该样本也属于这个类别
-
相似性:欧氏距离
-
分类问题的处理流程:
-
1.计算未知样本到每一个训练样本的距离2.将训练样本根据距离大小升序排列
3.取出距离最近的 K 个训练样本
4.进行多数表决,统计 K 个样本中哪个类别的样本个数最多
5.将未知的样本归属到出现次数最多的类别
回归问题的处理流程:
1.计算未知样本到每一个训练样本的距离
2.将训练样本根据距离大小升序排列
3.取出距离最近的 K 个训练样本
4.把这个 K 个样本的目标值计算其平均值
5.作为将未知的样本预测的值
API介绍
【实操】分类API
KNN分类API:
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
【实操】回归API
KNN分类API:
sklearn.neighbors.KNeighborsRegressor(n_neighbors=5)
# 1.工具包
from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor
# from sklearn.neighbors import KNeighborsRegressor
# 2.数据(特征工程)
# 分类
# x = [[0,2,3],[1,3,4],[3,5,6],[4,7,8],[2,3,4]]
# y = [0,0,1,1,0]
x = [[0,1,2],[1,2,3],[2,3,4],[3,4,5]]
y = [0.1,0.2,0.3,0.4]
# 3.实例化
# model =KNeighborsClassifier(n_neighbors=3)
model =KNeighborsRegressor(n_neighbors=3)
# 4.训练
model.fit(x,y)
# 5.预测
print(model.predict([[4,4,5]]))
距离度量方法
欧式距离
曼哈顿距离
切比雪夫距离
闵氏距离
特征预处理
为什么进行归一化、标准化
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些模型(算法)无法学习到其它的特征
归一化
通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间
数据归一化的API实现
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
feature_range 缩放区间
- 调用 fit_transform(X) 将特征进行归一化缩放
- 归一化受到最大值与最小值的影响,这种方法容易受到异常数据的影响, 鲁棒性较差,适合传统精确小数据场景
标准化
通过对原始数据进行标准化,转换为均值为0标准差为1的标准正态分布的数据
- mean 为特征的平均值
- σ 为特征的标准差
数据标准化的API实现
sklearn.preprocessing. StandardScaler()
调用 fit_transform(X) 将特征进行归一化缩放
# 1.导入工具包
from sklearn.preprocessing import MinMaxScaler,StandardScaler
# 2.数据(只有特征)
x = [[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]]
# 3.实例化(归一化,标准化)
# process =MinMaxScaler()
process =StandardScaler()
# 4.fit_transform 处理1
data =process.fit_transform(x)
# print(data)
print(process.mean_)
print(process.var_)
对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大
【实操】利用KNN算法进行鸢尾花分类
鸢尾花Iris Dataset数据集是机器学习领域经典数据集,鸢尾花数据集包含了150条鸢尾花信息,每50条取自三个鸢尾花中之一:Versicolour、Setosa和Virginica
每个花的特征用如下属性描述:
代码实现:
# 导入工具包
from sklearn.datasets import load_iris # 加载鸢尾花测试集的.
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split # 分割训练集和测试集的
from sklearn.preprocessing import StandardScaler # 数据标准化的
from sklearn.neighbors import KNeighborsClassifier # KNN算法 分类对象
from sklearn.metrics import accuracy_score # 模型评估的, 计算模型预测的准确率
# 1. 定义函数 dm01_loadiris(), 加载数据集.
def dm01_loadiris():
# 1. 加载数据集, 查看数据
iris_data = load_iris()
print(iris_data) # 字典形式, 键: 属性名, 值: 数据.
print(iris_data.keys())
# 1.1 查看数据集
print(iris_data.data[:5])
# 1.2 查看目标值.
print(iris_data.target)
# 1.3 查看目标值名字.
print(iris_data.target_names)
# 1.4 查看特征名.
print(iris_data.feature_names)
# 1.5 查看数据集的描述信息.
print(iris_data.DESCR)
# 1.6 查看数据文件路径
print(iris_data.filename)
# 2. 定义函数 dm02_showiris(), 显示鸢尾花数据.
def dm02_showiris():
# 1. 加载数据集, 查看数据
iris_data = load_iris()
# 2. 数据展示
# 读取数据, 并设置 特征名为列名.
iris_df = pd.DataFrame(iris_data.data, columns=iris_data.feature_names)
# print(iris_df.head(5))
iris_df['label'] = iris_data.target
# 可视化, x=花瓣长度, y=花瓣宽度, data=iris的df对象, hue=颜色区分, fit_reg=False 不绘制拟合回归线.
sns.lmplot(x='petal length (cm)', y='petal width (cm)', data=iris_df, hue='label', fit_reg=False)
plt.title('iris data')
plt.show()
# 3. 定义函数 dm03_train_test_split(), 实现: 数据集划分
def dm03_train_test_split():
# 1. 加载数据集, 查看数据
iris_data = load_iris()
# 2. 划分数据集, 即: 特征工程(预处理-标准化)
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2,
random_state=22)
print(f'数据总数量: {len(iris_data.data)}')
print(f'训练集中的x-特征值: {len(x_train)}')
print(f'训练集中的y-目标值: {len(y_train)}')
print(f'测试集中的x-特征值: {len(x_test)}')
# 4. 定义函数 dm04_模型训练和预测(), 实现: 模型训练和预测
def dm04_model_train_and_predict():
# 1. 加载数据集, 查看数据
iris_data = load_iris()
# 2. 划分数据集, 即: 数据基本处理
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=22)
# 3. 数据集预处理-数据标准化(即: 标准的正态分布的数据集)
transfer = StandardScaler()
# fit_transform(): 适用于首次对数据进行标准化处理的情况,通常用于训练集, 能同时完成 fit() 和 transform()。
x_train = transfer.fit_transform(x_train)
# transform(): 适用于对测试集进行标准化处理的情况,通常用于测试集或新的数据. 不需要重新计算统计量。
x_test = transfer.transform(x_test)
# 4. 机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=5)
estimator.fit(x_train, y_train)
# 5. 模型评估.
# 场景1: 对抽取出的测试集做预测.
# 5.1 模型评估, 对抽取出的测试集做预测.
y_predict = estimator.predict(x_test)
print(f'预测结果为: {y_predict}')
# 场景2: 对新的数据进行预测.
# 5.2 模型预测, 对测试集进行预测.
# 5.2.1 定义测试数据集.
my_data = [[5.1, 3.5, 1.4, 0.2]]
# 5.2.2 对测试数据进行-数据标准化.
my_data = transfer.transform(my_data)
# 5.2.3 模型预测.
my_predict = estimator.predict(my_data)
print(f'预测结果为: {my_predict}')
# 5.2.4 模型预测概率, 返回每个类别的预测概率
my_predict_proba = estimator.predict_proba(my_data)
print(f'预测概率为: {my_predict_proba}')
# 6. 模型预估, 有两种方式, 均可.
# 6.1 模型预估, 方式1: 直接计算准确率, 100个样本中模型预测正确的个数.
my_score = estimator.score(x_test, y_test)
print(my_score) # 0.9666666666666667
# 6.2 模型预估, 方式2: 采用预测值和真实值进行对比, 得到准确率.
print(accuracy_score(y_test, y_predict))
# 在main方法中测试.
if __name__ == '__main__':
# 1. 调用函数 dm01_loadiris(), 加载数据集.
# dm01_loadiris()
# 2. 调用函数 dm02_showiris(), 显示鸢尾花数据.
# dm02_showiris()
# 3. 调用函数 dm03_train_test_split(), 查看: 数据集划分
# dm03_train_test_split()
# 4. 调用函数 dm04_模型训练和预测(), 实现: 模型训练和预测
dm04_model_train_and_predict()
坚持分享 共同进步 如有错误 欢迎指出