Press "Enter" to skip to content

机器学习(七):sklearn转换器估计器及K-近邻算法

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

@ TOC

 

:loudspeaker::loudspeaker::loudspeaker::mega::mega::mega:

 

:sunflower::sunflower::sunflower:Hello,大家好我叫 是Dream呀 ,一个有趣的Python博主,多多关照:stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye:

 

作者简介: Python领域优质创作者 :trophy: CSDN年度博客之星 :trophy: 阿里云专家博主 :trophy: 华为云享专家 :trophy: 51CTO专家博主 :trophy:

:two_hearts:入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!:rocket::rocket::rocket:
:heartbeat:最后,愿我们都能在看不到的地方闪闪发光,一起加油进步:beer::beer::beer:

:watermelon::watermelon::watermelon:一万次悲伤,依然会有Dream,我一直在最温暖的地方等你~:rainbow::rainbow::rainbow:

 

:star2::star2::star2::sparkles::sparkles::sparkles:

 

 

一、转换器和估计器

 

1. 转换器

 

想一下之前做的特征工程的步骤?

1、实例化 (实例化的是一个转换器类(Transformer))
2、调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)

我们把特征工程的接口称之为转换器,其中转换器调用有这幺几种形式:

标准化:
(x – mean) / std
fit_transform()
fit() 计算 每一列的平均值、标准差
transform() (x – mean) / std进行最终的转换

这几个方法之间的区别是什幺呢?我们看以下代码就清楚了

 

In [1]: from sklearn.preprocessing import StandardScaler
In [2]: std1 = StandardScaler()
In [3]: a = [[1,2,3], [4,5,6]]
In [4]: std1.fit_transform(a)
Out[4]:
array([[-1., -1., -1.],
       [ 1.,  1.,  1.]])
In [5]: std2 = StandardScaler()
In [6]: std2.fit(a)
Out[6]: StandardScaler(copy=True, with_mean=True, with_std=True)
In [7]: std2.transform(a)
Out[7]:
array([[-1., -1., -1.],
       [ 1.,  1.,  1.]])

 

从中可以看出,fit_transform的作用相当于transform加上fit。但是为什幺还要提供单独的fit呢, 我们还是使用原来的std2来进行标准化看看:

 

In [8]: b = [[7,8,9], [10, 11, 12]]
In [9]: std2.transform(b)
Out[9]:
array([[3., 3., 3.],
       [5., 5., 5.]])
In [10]: std2.fit_transform(b)
Out[10]:
array([[-1., -1., -1.],
       [ 1.,  1.,  1.]])

 

2.估计器(sklearn机器学习算法的实现)

 

在sklearn中,估计器(estimator)是一个重要的角色,是一类实现了算法的API

1 实例化一个estimator
2 estimator.fit(x_train, y_train) 计算
—— 调用完毕,模型生成
3 模型评估:
1)直接比对真实值和预测值
y_predict = estimator.predict(x_test)
y_test == y_predict
2)计算准确率
accuracy = estimator.score(x_test, y_test)

种类:

 

1、用于分类的估计器:

sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
sklearn.tree 决策树与随机森林

2、用于回归的估计器:

sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归

3、用于无监督学习的估计器

 

sklearn.cluster.KMeans 聚类

3.估计器工作流程

二、K-近邻算法

1.K-近邻算法(KNN)

你的“邻居”来推断出你的类别

2. 定义

如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

 

来源:KNN算法最早是由Cover和Hart提出的一种分类算法

 

3. 距离公式

 

两个样本的距离可以通过如下公式计算,又叫 欧式距离

 

三、电影类型分析

 

假设我们有现在几部电影

 

其中? 号电影不知道类别,如何去预测?我们可以利用K近邻算法的思想

 

1 问题

 

如果取的最近的电影数量不一样?会是什幺结果?

 

k = 1 爱情片

 

k = 2 爱情片

 

……

 

k = 6 无法确定

 

k = 7 动作片

 

如果取的最近的电影数量不一样?会是什幺结果?

 

**- k 值取得过小,容易受到异常点的影响

k 值取得过大,样本不均衡的影响**

2 K-近邻算法数据的特征工程处理

 

结合前面的约会对象数据,分析K-近邻算法需要做什幺样的处理

 

无量纲化的处理

 

标准化

 

四、K-近邻算法API

 

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=’auto’)

 

n_neighbors:k值

n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)

1.步骤

 

鸢尾花种类预测:

 

数据,我们用的就是 sklearn 中自带的鸢尾花数据。

 

1)获取数据

2)数据集划分

3)特征工程

标准化

4)KNN预估器流程

5)模型评估

 

2.代码

 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def knn_iris():
    """
    用KNN算法对鸢尾花进行分类
    :return:
    """
    # 1)获取数据
    iris = load_iris()
    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
    # 3)特征工程:标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4)KNN算法预估器
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)
    # 5)模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:
", y_predict)
    print("直接比对真实值和预测值:
", y_test == y_predict)
    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:
", score)
    return None

 

3.结果及分析

 

结果分析:

 

准确率: 分类算法的评估之一

 

1、k值取多大?有什幺影响?

 

k值取很小:容易受到异常点的影响

 

k值取很大:受到样本均衡的问题

 

2、性能问题?

 

距离计算上面,时间复杂度高

 

五、K-近邻总结

 

优点:

 

简单,易于理解,易于实现,无需训练

 

缺点:

懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定K值,K值选择不当则分类精度不能保证

使用场景:小数据场景,几千~几万样本,具体场景具体业务去测试

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注