Python sklearn转换器估计器和K-近邻算法

2022-08-30 18:03:32
目录
一、转换器和估计器1. 转换器2.估计器(sklearn机器学习算法的实现)3.估计器工作流程二、K-近邻算法1.K-近邻算法(KNN)2. 定义3. 距离公式三、电影类型分析1 问题2 K-近邻算法数据的特征工程处理四、K-近邻算法API1.步骤2.代码3.结果及分析五、K-近邻总结

一、转换器和估计器

1.>

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

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

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

      标准化:(x - mean) / stdfit_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>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-近邻算法API

                sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)n_neighbors:k值

                  n_neighbors:int,可选(默认=>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:\n", y_predict)
                        print("直接比对真实值和预测值:\n", y_test == y_predict)
                        # 方法2:计算准确率
                        score = estimator.score(x_test, y_test)
                        print("准确率为:\n", score)
                        return None

                    3.结果及分析

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

                    1、k值取多大?有什么影响?
                    k值取很小:容易受到异常点的影响

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

                    2、性能问题?
                    距离计算上面,时间复杂度高

                    五、K-近邻总结

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

                    缺点:

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

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

                      到此这篇关于Python>