如何用scikit-learn进行多变量线性回归?

时间:2016-07-12 09:39:58

标签: python machine-learning scikit-learn linear-regression

原谅我的术语,我不是ML专业人士。我可能会使用下面的错误条款。

我正在尝试执行多变量线性回归。假设我试图通过分析网站上的网页浏览量来确定用户性别。

对于我认识的性别的每个用户,我有一个特征矩阵,其中每一行代表一个网站部分,第二个元素是他们是否访问过它,例如:

male1 = [
    [1, 1],     # visited section 1
    [2, 0],     # didn't visit section 2
    [3, 1],     # visited section 3, etc
    [4, 0]
]

所以在scikit中,我正在构建xsys。我代表男性为1,女性为0。

以上将表示为:

features = male1
gender = 1

现在,我显然不只是为单个用户培训模型,而是我有成千上万的用户使用我的数据进行培训。

我原本以为我应该创建我的xsys,如下所示:

xs = [
    [          # user1
       [1, 1],    
       [2, 0],     
       [3, 1],    
       [4, 0]
    ],
    [          # user2
       [1, 0],    
       [2, 1],     
       [3, 1],    
       [4, 0]
    ],
    ...
]

ys = [1, 0, ...]

scikit不喜欢这个:

from sklearn import linear_model

clf = linear_model.LinearRegression()
clf.fit(xs, ys)

它抱怨道:

ValueError: Found array with dim 3. Estimator expected <= 2.

我如何在scikit-learn中为线性回归算法提供特征矩阵?

1 个答案:

答案 0 :(得分:3)

您需要以不同的方式创建xs。根据{{​​3}}:

fit(X, y, sample_weight=None)
     

参数:

    X : numpy array or sparse matrix of shape [n_samples, n_features]
        Training data
    y : numpy array of shape [n_samples, n_targets]
        Target values
    sample_weight : numpy array of shape [n_samples]
        Individual weights for each sample

因此xs应该是一个2D数组,其行数与用户数相同,列数与网站部分数相同。您已将xs定义为3D数组。为了将维度数量减少一个,您可以通过列表理解来删除部分编号:

xs = [[visit for section, visit in user] for user in xs]

如果您这样做,您作为示例提供的数据将转换为:

xs = [[1, 0, 1, 0], # user1
      [0, 1, 1, 0], # user2
      ...
      ]

clf.fit(xs, ys)应该按预期工作。

降低尺寸的更有效方法是切割NumPy数组:

import numpy as np
xs = np.asarray(xs)[:,:,1]