【问题标题】:Cannot understand with sklearn's PolynomialFeatures无法理解 sklearn 的 PolynomialFeatures
【发布时间】:2019-01-25 03:20:05
【问题描述】:

在 sklearn 的多项式特征方面需要帮助。它适用于一个功能,但每当我添加多个功能时,它还会在数组中输出一些值,除了提升到度数的值。 例如:对于这个数组,

X=np.array([[230.1,37.8,69.2]])

当我尝试时

X_poly=poly.fit_transform(X)

输出

[[ 1.00000000e+00 2.30100000e+02 3.78000000e+01 6.92000000e+01
5.29460100e+04 8.69778000e+03 1.59229200e+04 1.42884000e+03
2.61576000e+03 4.78864000e+03]]

这里,8.69778000e+03,1.59229200e+04,2.61576000e+03 是什么?

【问题讨论】:

    标签: python machine-learning scikit-learn polynomials


    【解决方案1】:

    检查功能的一般方法是使用poly.get_feature_names()。在这种情况下,它会是

    In [15]: poly.get_feature_names(['a','b','c'])
    Out[15]: ['1', 'a', 'b', 'c', 'a^2', 'a b', 'a c', 'b^2', 'b c', 'c^2']
    

    8.69778000e+03,1.59229200e+04,2.61576000e+03 将对应于a*ba*cb*cterms,相应地。

    【讨论】:

      【解决方案2】:

      根据 scikit 的 0.23 docs(以及早在 0.15),PolynomialFeatures

      [生成]一个新的特征矩阵,由度数小于或等于指定度数的特征的所有多项式组合组成。 例如,如果输入样本是二维的,形式为 [a, b],则 2 次多项式特征为 [1, a, b, a^2, ab, b^2] .

      【讨论】:

        【解决方案3】:

        PolynomialFeatures 生成一个新矩阵,其中包含具有给定度数的特征的所有多项式组合。

        Like [a] 将被转换为 [1,a,a^2] 的度数为 2。

        您可以将输入转换为由 PolynomialFeatures 生成的矩阵。

        from sklearn.preprocessing import PolynomialFeatures
        a = np.array([1,2,3,4,5])
        a = a[:,np.newaxis]
        poly = PolynomialFeatures(degree=2)
        a_poly = poly.fit_transform(a)
        print(a_poly)
        

        输出:

         [[ 1.  1.  1.]
         [ 1.  2.  4.]
         [ 1.  3.  9.]
         [ 1.  4. 16.]
         [ 1.  5. 25.]]
        

        可以看到以[1,a,a^2]形式生成的矩阵

        要观察散点图上的多项式特征,我们使用数字 1-100。

        import numpy as np
        from sklearn.preprocessing import StandardScaler
        from sklearn.preprocessing import PolynomialFeatures
        
        #Making 1-100 numbers
        a = np.arange(1,100,1)
        a = a[:,np.newaxis]
        
        #Scaling data with 0 mean and 1 standard Deviation, so it can be observed easily
        scaler = StandardScaler()
        a = scaler.fit_transform(a)
        
        #Applying PolynomialFeatures
        poly = PolynomialFeatures(degree=2)
        a_poly = poly.fit_transform(a)
        
        #Flattening Polynomial feature matrix (Creating 1D array), so it can be plotted. 
        a_poly = a_poly.flatten()
        #Creating array of size a_poly with number series. (For plotting)
        xarr = np.arange(1,a_poly.size+1,1)
        
        #Plotting
        plt.scatter(xarr,a_poly)
        plt.title("Degree 2 Polynomial")
        plt.show()
        

        输出:

        改变度数=3,我们得到:

        【讨论】:

          【解决方案4】:

          如果您有特征[a, b, c],则默认多项式特征(在sklearn 中度数为2)应为[1, a, b, c, a^2, b^2, c^2, ab, bc, ca]

          2.61576000e+0337.8x62.2=2615,76 (2615,76 = 2.61576000 x 10^3)

          您可以通过PolynomialFeatures 以一种简单的方式创建新功能。有一个很好的参考here。当然,使用PolynomialFeatures(见here)也有缺点(“过拟合”)。

          编辑:
          我们在使用多项式特征时必须小心。多项式特征个数的计算公式为N(n,d)=C(n+d,d),其中n是特征个数,d是多项式的次数,C是二项式系数(组合)。在我们的例子中,数字是C(3+2,2)=5!/(5-2)!2!=10,但是当特征的数量或度数是高度时,多项式特征变得太多了。例如:

          N(100,2)=5151
          N(100,5)=96560646
          

          所以在这种情况下,您可能需要应用正则化来惩罚一些权重。该算法很有可能会开始受到curse of dimensionality 的影响(here 也是一个很好的讨论)。

          【讨论】:

          • 为什么会给出ab,bc,ca?
          • @TechieBoy101:这是多项式特征,而不是单项特征。没有什么限制它一次只能使用一个变量。
          • @TechieBoy101,sklearn 中的默认PolynomialFeatures 包括所有多项式组合。您可以添加interaction_only=True 以排除a^2, b^2, c^2 之类的权力。当然,如果您的模型表现更好,您可以排除交互 - PolynomialFeatures 是派生新特征的简单方法(以某种人为方式)。
          • 多项式特征公式不正确,尽管bc 的位置是正确的。请参阅poly.get_feature_names(['a','b','c']),它将给出['1', 'a', 'b', 'c', 'a^2', 'a b', 'a c', 'b^2', 'b c', 'c^2']
          • @dim 当我们通过将数据提升为幂来添加附加特征时,我们不是引入了多重共线性吗?
          【解决方案5】:

          您有 3 维数据,以下代码生成所有 2 次多边形特征:

          X=np.array([[230.1,37.8,69.2]])
          from sklearn.preprocessing import PolynomialFeatures
          poly = PolynomialFeatures()
          X_poly=poly.fit_transform(X)
          X_poly
          #array([[  1.00000000e+00,   2.30100000e+02,   3.78000000e+01,
          #      6.92000000e+01,   5.29460100e+04,   8.69778000e+03,
          #      1.59229200e+04,   1.42884000e+03,   2.61576000e+03,
          #      4.78864000e+03]])
          

          这也可以使用以下代码生成:

          a, b, c = 230.1, 37.8, 69.2 # 3-dimensional data
          np.array([[1,a,b,c,a**2,a*b,c*a,b**2,b*c,c**2]]) # all possible degree-2 polynomial features
          # array([[  1.00000000e+00,   2.30100000e+02,   3.78000000e+01,
                6.92000000e+01,   5.29460100e+04,   8.69778000e+03,
                1.59229200e+04,   1.42884000e+03,   2.61576000e+03,
                4.78864000e+03]])
          

          【讨论】:

            猜你喜欢
            • 2017-09-04
            • 2015-09-18
            • 2014-05-19
            • 2016-08-12
            • 2012-08-14
            • 2017-05-15
            • 1970-01-01
            • 2016-06-21
            • 2018-04-08
            相关资源
            最近更新 更多