Python3.6 k-近邻算法基础入门实践

声明:参考B站视频,自学成长记录
https://www.bilibili.com/video/BV1L4411s7mQ?p=152

分类算法:k-近邻算法

所谓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()

运行结果
在这里插入图片描述

交叉验证和网格搜索对k-近邻算法调优

交叉验证过程

将拿到的训练数据分为训练集与验证集(不包含测试集)
将数据分成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中找到训练数据并下载,对此表示非常感谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值