机器学习【KNN案例、API、总结】

本文深入探讨了使用Python的scikit-learn库进行机器学习,特别是K-Nearest Neighbor (KNN)算法。首先介绍了鸢尾花数据集,包括scikit-learn的数据集API和数据分布的可视化。接着详细讲解了特征预处理,包括归一化和标准化,并提供了相关API的使用示例。然后,展示了KNN算法的实现流程,包括数据集划分、模型训练和预测。文章总结了KNN算法的优点和缺点,并提到了交叉验证和网格搜索在模型选择和调优中的应用。最后,通过预测Facebook签到位置的案例,再次展示了KNN的实际运用和模型评估过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 案例数据集介绍

主要介绍使用Python进行机器学习的一些基本概念。 在此案例中,将使用K-Nearest Neighbor(KNN)算法对鸢尾花的种类进行分类,并测量花的特征。

1 案例:鸢尾花种类预测

Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。关于数据集的具体介绍:
在这里插入图片描述
在这里插入图片描述

2 scikit-learn中数据集介绍

2.1 scikit-learn数据集API介绍

sklearn.datasets:加载获取流行数据集
	datasets.load_*()
		获取小规模数据集,数据包含在datasets里
	datasets.fetch_*(data_home=None)
		获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
2.1.1 sklearn小数据集

sklearn.datasets.load_iris() 加载并返回鸢尾花数据集

from sklearn.datasets import load_iris

# 小数据集获取
iris = load_iris()
print(iris)
2.1.2 sklearn大数据集

sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

​ subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集。

​ 训练集的“训练”,测试集的“测试”,两者的“全部”

from sklearn.datasets import fetch_20newsgroups
# 大数据集获取
news = fetch_20newsgroups()
print(news)

2.2 sklearn数据集返回值介绍

load和fetch返回的数据类型datasets.base.Bunch(字典格式)

​ data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组

​ target:标签数组,是 n_samples 的一维 numpy.ndarray 数组

​ DESCR:数据描述

​ feature_names:特征名,新闻数据,手写数字、回归数据集没有

​ target_names:标签名

from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris)
# 返回值是一个继承自字典的Bench
print("鸢尾花的特征值:\n", iris["data"])
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
print("鸢尾花的描述:\n", iris.DESCR)

2.3 查看数据分布

通过创建一些图,以查看不同类别是如何通过特征来区分的。 在理想情况下,标签类将由一个或多个特征对完美分隔。 在现实世界中,这种理想情况很少会发生。

seaborn介绍

​ Seaborn 是基于 Matplotlib 核心库进行了更高级的 API 封装,可以轻松地画出更漂亮的图形。而 Seaborn 的漂亮主要体现在配色更加舒服、以及图形元素的样式更加细腻。

​ 安装 pip3 install seaborn

​ seaborn.lmplot() 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合

​ 参数说明:

​ sns.lmplot() 里的 x, y 分别代表横纵坐标的列名,

​ data= 是关联到数据集,

​ hue= 代表按照 species即花的类别分类显示,

​ fit_reg=是否进行线性拟合。

# 内嵌绘图
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 把数据转换成dataframe的格式,第一个参数为数据源,columns为列名
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
# 添加target列
iris_d['Species'] = iris.target
# 使用函数进行画图,因为四列两两组合有六种情况,使用函数可以任意组合
def plot_iris(iris, col1, col2):
    # hue为类别(target) fit_reg = false 取消线性拟合
    sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('鸢尾花种类分布图')
    plt.show()
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')

在这里插入图片描述

2.4 数据集的划分

机器学习一般的数据集会划分为两个部分:训练数据:用于训练,构建模型;测试数据:在模型检验时使用,用于评估模型是否有效

划分比例:训练集:70% 80% 75%;测试集:30% 20% 25%

数据集划分api

sklearn.model_selection.train_test_split(arrays, *options)

​ x 数据集的特征值

​ y 数据集的标签值

​ test_size 测试集的大小,一般为float

​ random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。

​ return 测试集特征,训练集特征值,训练标签,测试标签(默认随机取)

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 获取鸢尾花数据集
iris = load_iris()
# 对鸢尾花数据集进行分割
# 会返回四个值:
#   训练集的特征值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("x_train:\n", x_train.shape)
# 随机数种子
x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
print("如果随机数种子不一致:\n", x_train == x_train1)
print("如果随机数种子一致:\n", x_train1 == x_train2)

二 特征工程-特征预处理

1 什么是特征预处理

scikit-learn的解释

provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

在这里插入图片描述

特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级容易影响(支配)目标结果,使得一些算法无法学习到其它的特征

需要用到一些方法(归一化,标准化)进行无量纲化使不同规格的数据转换到同一规格

特征预处理API:sklearn.preprocessing

2 归一化

通过对原始数据进行变换把数据映射到(默认为[0,1])之间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值