KNN 算法
knn算法思想 : K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别
如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别
常见距离公式
欧氏距离 (直角坐标系中两点之间线段长度)
曼哈顿距离(城市街区距离)(只能上下左右走)
- 也叫城市街区距离
- 特点: 横平竖直
切比雪夫距离(上下左右斜线八个方向)
闵可夫斯基距离 (闵氏距离)
闵可夫斯基距离 Minkowski Distance 闵氏距离,不是一种新的距离的度量方式。而是距离的组合 是对多个距离度量公式的概括性的表述
特征的预处理
特征的单位或者大小相差较大, 或者某特征方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些模型(算法)无法学习到其他的特征
-
归一化 : 通过对原始数据进行变换 把数据映射到 [mi,mx]默认[0,1]之间
-
公式
-
弊端 : 容易受到最大值 最小值的影响 若他们差值过大 影响整体效果
API实现:
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
-
-
标准化: 对原始数据做处理 转化为 均值为 0 标准差为 1 的标准正态分布序列
- 公式: x’ = (x - 该列的平均值mean) / 该列的标准差
- 标准化适用于 大数据集的 特征预处理
- sklearn.preprocessing.StandardScaler
API实现:
sklearn.preprocessing. StandardScaler()
# 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
代码实现:
# 0.导入工具包
from sklearn.datasets import load_iris
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 1.加载数据集
iris_data = load_iris()
# print(iris_data)
# print(iris_data.target)
# 2.数据展示
iris_df = pd.DataFrame(iris_data['data'], columns=iris_data.feature_names)
iris_df['label'] = iris_data.target
# print(iris_data.feature_names)
# sns.lmplot(x='sepal length (cm)',y='sepal width (cm)',data = iris_df,hue='label')
# plt.show()
# 3.特征工程(预处理-标准化)
# 3.1 数据集划分
x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.3, random_state=22)
print(len(iris_data.data))
print(len(x_train))
# 3.2 标准化
process = StandardScaler()
x_train = process.fit_transform(x_train)
x_test = process.transform(x_test)
# 4.模型训练
# 4.1 实例化
model = KNeighborsClassifier(n_neighbors=3)
# 4.2 调用fit法
model.fit(x_train,y_train)
# 5.模型预测
x = [[5.1, 3.5, 1.4, 0.2]]
x=process.transform(x)
y_predict =model.predict(x_test)
print(model.predict_proba(x))
# 6.模型评估(准确率)
# 6.1 使用预测结果
acc =accuracy_score(y_test,y_predict)
print(acc)
# 6.2 直接计算
acc = model.score(x_test,y_test)
print(acc)
超参数选择方法
交叉验证是一种数据集的分割方法,将训练集划分为 n 份,其中一份做验证集、其他n-1份做训练集集
交叉验证法原理:将数据集划分为 cv=10 份:
1.第一次:把第一份数据做验证集,其他数据做训练
2.第二次:把第二份数据做验证集,其他数据做训练
3… 以此类推,总共训练10次,评估10次。
4.使用训练集+验证集多次评估模型,取平均值做交叉验证为模型得分
5.若k=5模型得分最好,再使用全部训练集(训练集+验证集) 对k=5模型再训练一边,再使用测试集对k=5模型做评估