如何对某些字符串变量应用 sklearn 的线性回归
How to apply linear regresssion of sklearn for some string variable
我将使用逻辑回归预测电影的票房。
我得到了一些火车数据,包括演员和导演。这是我的数据:
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。如果相应的电影是由 Director1 执导的,则 D1 的值为 1,否则为 0;如果电影由 Director2 执导,则 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=0
和 D2=0
,您将知道这部电影是由 Director3 导演的。您不需要指定 D3=1
.
在 scikit-learn 中,这个转换是用 OneHotEncoder. The example is from scikit-learn documentation:
完成的
您有三个分类变量:性别、地区和浏览器。性别有 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),接下来的三个表示地区,依此类推。
我将使用逻辑回归预测电影的票房。 我得到了一些火车数据,包括演员和导演。这是我的数据:
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。如果相应的电影是由 Director1 执导的,则 D1 的值为 1,否则为 0;如果电影由 Director2 执导,则 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=0
和 D2=0
,您将知道这部电影是由 Director3 导演的。您不需要指定 D3=1
.
在 scikit-learn 中,这个转换是用 OneHotEncoder. The example is from scikit-learn documentation:
完成的您有三个分类变量:性别、地区和浏览器。性别有 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),接下来的三个表示地区,依此类推。