如何对某些字符串变量应用 sklearn 的线性回归



我将使用逻辑回归来预测电影的票房。我得到了一些火车数据,包括演员和导演。这是我的数据:

Director1|Actor1|300 million
Director2|Actor2|500 million

我将使用整数对导演和演员进行编码。

1|1|300 million
2|2|300 million

这意味着X={[1,1],[2,2]} y=[300,500]fit(X,y)这行得通吗?

您不能像这样在线性回归中使用分类变量。线性回归将所有变量视为数值变量。因此,如果将 Director1 编码为 1,将 Director2 编码为 2,则线性回归将尝试基于该编码方案查找关系。它将假定 Director2 的大小是 Director1 的两倍。实际上,这些数字没有任何意义。您可以将它们编码为 143 和 9879,应该没有任何区别。它们没有任何数字含义。为了确保线性回归正确处理它们,您需要使用虚拟变量。

使用虚拟变量,每个类别级别都有一个变量。例如,如果您有 3 个控制器,您将有 3 个变量:D1、D2 和 D3。如果相应的电影由导演 1 执导,则 D1 的值为 1,否则为 0;如果电影由导演 2 执导,则 D2 的值为 1,否则为 0...因此,使用一组值 D2 D1 D2 D3 D1 D2,您的虚拟变量将为:

    D1 D2 D3
D2  0  1  0
D1  1  0  0
D2  0  1  0
D3  0  0  1
D1  1  0  0
D2  0  1  0

在线性回归中,为了避免多重共线性,我们只使用这些变量中的n-1个,其中n是类别的数量(本例中的控制器数量(。将选择其中一个控制器作为基数,并由回归模型中的常量表示。哪一个并不重要。例如,如果排除D3,则如果D1=0D2=0,您将知道该电影由导演3执导。您无需指定D3=1

在scikit-learn中,这种转换是通过OneHotEncoder完成的。这个例子来自scikit-learn文档:

您有三个分类变量:性别、区域和浏览器。性别有2个级别:["male", "female"],区域有三个级别:["from Europe", "from US", "from Asia"]和浏览器有四个级别:["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]。假设它们是用从零开始的数字编码的。所以[0, 1, 2]是指使用Safari的美国男性。

>>> enc = preprocessing.OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
OneHotEncoder(categorical_features='all', dtype=<... 'float'>,
       handle_unknown='error', n_values='auto', sparse=True)
>>> enc.transform([[0, 1, 3]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])

通过enc.fit scikit-learn推断每个变量的水平数。对于像 [0, 1, 3] 这样的观察,如果你调用enc.transform你会看到它们的虚拟变量。请注意,生成的数组长度为 2 + 3 + 4 = 9。前两个用于性别(如果是男性,第一个为 1(,接下来三个用于区域,依此类推。

相关内容

  • 没有找到相关文章