声明:参考B站视频,自学成长记录
https://www.bilibili.com/video/BV1L4411s7mQ?p=152
所谓K近邻算法, 即是给定一个训练数据集
对新的输入实例, 在训练数据集中找到与该实例最邻近的K个实例(邻居)
这K个实例的多数属于某个类, 就把该输入实例分类到这个类中
代码示例
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
"""
预测糖尿病示例:
8个特征:
Pregnancies:怀孕次数
Glucose:血浆葡萄糖浓度,采用2小时口服葡萄糖耐量实验测得
BloodPressure:舒张压(毫米汞柱)
SkinThickness:肱三头肌皮肤褶皱厚度(毫米)
Insulin:两个小时血清胰岛素(μ U {\mu U}μU/毫升)
BMI:身体质量指数,体重除以身高的平方
Diabetes Pedigree Function:糖尿病血统指数,糖尿病和家庭遗传相关
Age:年龄
目标值:(Outcome为标签)
0表示没有糖尿病
1表示有糖尿病
"""
def knncls():
"""
k-近邻预测糖尿病
:return: None
"""
# 读取数据
data = pd.read_csv("diabetes.csv")
# 打印前十行
# print(data.head(10))
# 处理数据
# 1、缩小数据范围 筛选年龄 > 40 和 BMI > 22.5
data = data.query("Age > 40 & BMI > 22.5")
# 2、删除特怀孕次数征列 axis: 1 表示列
data = data.drop('Pregnancies', axis=1)
# 3、增加特征
# 提取数据中的特征值x 与目标值y
y = data['Outcome']
x = data.drop(['Outcome'], axis=1)
# 对数据进行分割(训练集75% + 测试集25%)
# 训练集: train(x_tarin-特征值 , y_train-目标值)
# 测试集: test(x_test-特征值, y_test-目标值)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 特征处理(对训练集和测试集的特征值进行标准化)
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 进行算法流程 k-近邻算法
knn = KNeighborsClassifier(n_neighbors=1)
# 1、学习训练集数据
knn.fit(x_train, y_train)
# 2、输入测试集的数据, 预测目标值
test_predict = knn.predict(x_test)
print(test_predict)
# 3、计算准确率
print("预测的准确率:", knn.score(x_test, y_test))
return None
if __name__ == '__main__':
knncls()
交叉验证过程
将拿到的训练数据分为训练集与验证集(不包含测试集)
将数据分成4份,其中一份作为验证集
然后经过4组的测试,每次更换不同的验证集
最终得到4组模型的结果,取平局值作为最终结果
又称4折交叉验证
交叉验证目的
是为了让被评估的模型更加准确可信
代码示例
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
"""
预测糖尿病示例:
8个特征:
Pregnancies:怀孕次数
Glucose:血浆葡萄糖浓度,采用2小时口服葡萄糖耐量实验测得
BloodPressure:舒张压(毫米汞柱)
SkinThickness:肱三头肌皮肤褶皱厚度(毫米)
Insulin:两个小时血清胰岛素(μ U {\mu U}μU/毫升)
BMI:身体质量指数,体重除以身高的平方
Diabetes Pedigree Function:糖尿病血统指数,糖尿病和家庭遗传相关
Age:年龄
目标值:(Outcome为标签)
0表示没有糖尿病
1表示有糖尿病
"""
def knncls():
"""
k-近邻预测糖尿病
:return: None
"""
# 读取数据
data = pd.read_csv("diabetes.csv")
# 打印前十行
# print(data.head(10))
# 处理数据
# 1、缩小数据范围 筛选年龄 > 40 和 BMI > 22.5
data = data.query("Age > 40 & BMI > 22.5")
# 2、删除特怀孕次数征列 axis: 1 表示列
data = data.drop('Pregnancies', axis=1)
# 3、增加特征
# 提取数据中的特征值x 与目标值y
y = data['Outcome']
x = data.drop(['Outcome'], axis=1)
# 对数据进行分割(训练集75% + 测试集25%)
# 训练集: train(x_tarin-特征值 , y_train-目标值)
# 测试集: test(x_test-特征值, y_test-目标值)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 特征处理(对训练集和测试集的特征值进行标准化)
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 进行算法流程 k-近邻算法
knn = KNeighborsClassifier()
# 1、构造超参数的值
param = {'n_neighbors': [1, 2, 3]}
# 2、进行网格搜索 2折
gc = GridSearchCV(knn, param_grid=param, cv=2)
# 3、学习训练集数据
gc.fit(x_train, y_train)
# 4、预测准确率
test_predict = gc.predict(x_test)
print("测试集的预测准确率:", gc.score(x_test, y_test))
print("在交叉验证中最好的结果:", gc.best_score_)
print("选择最好的模型为:", gc.best_estimator_)
print("每个超参数每次交叉验证的结果:", gc.cv_results_)
return None
if __name__ == '__main__':
knncls()
运行结果
C:\Python36\python.exe E:/py_data_analysis/k近邻算法.py
测试集的预测准确率: 0.574468085106383
在交叉验证中最好的结果: 0.6739130434782609
选择最好的模型为: KNeighborsClassifier(n_neighbors=3)
每个超参数每次交叉验证的结果: {'mean_fit_time': array([0.00099993, 0.00200009, 0.00100005]), 'std_fit_time': array([0.0000000e+00, 0.0000000e+00, 1.1920929e-07]), 'mean_score_time': array([0.00400031, 0.00400019, 0.00550032]), 'std_score_time': array([1.19209290e-07, 9.99927521e-04, 4.99725342e-04]), 'param_n_neighbors': masked_array(data=[1, 2, 3],
mask=[False, False, False],
fill_value='?',
dtype=object), 'params': [{'n_neighbors': 1}, {'n_neighbors': 2}, {'n_neighbors': 3}], 'split0_test_score': array([0.63768116, 0.63768116, 0.71014493]), 'split1_test_score': array([0.62318841, 0.62318841, 0.63768116]), 'mean_test_score': array([0.63043478, 0.63043478, 0.67391304]), 'std_test_score': array([0.00724638, 0.00724638, 0.03623188]), 'rank_test_score': array([2, 2, 1])}
Process finished with exit code 0
在https://blog.csdn.net/kun_csdn/article/details/88919091中找到训练数据并下载,对此表示非常感谢