首页 文章

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

提问于
浏览
2

原谅我的术语,我不是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 回答

  • 3

    您需要以不同的方式创建 xs . 根据docs

    fit(X,y,sample_weight = None)
    参数:X:numpy数组或形状稀疏矩阵[n_samples,n_features]
    培训数据
    y:numpy数组形状[n_samples,n_targets]
    目标值
    sample_weight:numpy数组形状[n_samples]
    每个样品的单独重量

    因此 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]
    

相关问题