python学习笔记05——机器学习——K-近邻算法

                                                                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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K近邻算法是一种简单易用的机器学习算法,它可以用于分类和回归问题。在分类问题,K近邻算法通过计算待分类样本与训练集每个样本的距离,找到距离待分类样本最近的K个样本,然后根据这K个样本的类别进行投票,将待分类样本归为票数最多的类别。在回归问题,K近邻算法通过计算待预测样本与训练集每个样本的距离,找到距离待预测样本最近的K个样本,然后根据这K个样本的值进行加权平均,得到待预测样本的预测值。 下面是一个使用K近邻算法进行乳腺癌检测分类的示例代码: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 读取数据集 data = pd.read_csv("breast_cancer.csv") # 将类别变量转换为数值变量 data['diagnosis'] = data['diagnosis'].map({'M': 1, 'B': 0}) # 将特征变量和类别变量分开 X = data.drop(['diagnosis'], axis=1) y = data['diagnosis'] # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 创建K近邻分类器 knn = KNeighborsClassifier(n_neighbors=5) # 训练K近邻分类器 knn.fit(X_train, y_train) # 在测试集上进行预测 y_pred = knn.predict(X_test) # 计算预测准确率 accuracy = accuracy_score(y_test, y_pred) print("预测准确率:", accuracy) ``` 上述代码使用了sklearn库KNeighborsClassifier类来创建K近邻分类器,并使用accuracy_score函数计算预测准确率。需要注意的是,K近邻算法对数据的缩放敏感,因此在使用K近邻算法之前,通常需要对数据进行缩放处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值