具有字符串/分类特征(变量)的线性回归分析?
machine-learning
python
regression
5
0

回归算法似乎正在处理以数字表示的特征。例如:

在此处输入图片说明

该数据集不包含分类特征/变量。很清楚如何对这些数据进行回归并预测价格。


但是现在我想对包含分类特征的数据进行回归分析:

在此处输入图片说明

5个功能: DistrictConditionMaterialSecurityType


如何对这些数据进行回归?我是否必须将所有这些字符串/分类数据手动转换为数字?我的意思是,如果我必须创建一些编码规则,并根据该规则将所有数据转换为数值。是否有任何简单的方法可以将字符串数据转换为数字,而无需手动创建自己的编码规则?可能在Python中可以使用一些库吗?是否存在由于“编码错误”而导致回归模型以某种方式不正确的风险?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

在使用分类变量进行线性回归时,应注意“虚拟变量陷阱”。虚拟变量陷阱是其中自变量是多重共线性的场景,即两个或多个变量高度相关的场景。简单来说,可以从其他变量中预测一个变量。这会产生模型的奇异性,这意味着您的模型将无法工作。 在这里阅读

想法是使用伪变量编码,其drop_first=True ,将类别变量转换为伪变量/指标变量后,将在每个类别中省略一列。通过这样做,您不会丢失任何相关信息,因为其他功能可以完全解释数据集中的所有点。

这是有关如何为住房数据集进行处理的完整代码

因此,您具有分类功能:

District, Condition, Material, Security, Type

您尝试预测的一种数值特征:

Price

首先,您需要将初始数据集拆分为输入变量和预测,并假设其pandas数据框如下所示:

输入变量:

X = housing[['District','Condition','Material','Security','Type']]

预测:

Y = housing['Price']

将类别变量转换为虚拟变量/指标变量,并在每个类别中添加一个:

X = pd.get_dummies(data=X, drop_first=True)

因此,现在如果您使用drop_first=True检查X的形状,您将看到它的列减少了4列-每个分类变量对应一列。

现在,您可以继续在线性模型中使用它们。对于scikit-learn实现,它可能如下所示:

from sklearn import linear_model
from sklearn.model_selection import train_test_split
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = .20, random_state = 40)
        regr = linear_model.LinearRegression() # Do not use fit_intercept = False if you have removed 1 column after dummy encoding
        regr.fit(X_train, Y_train)
    predicted = regr.predict(X_test)
收藏
评论

在这种情况下,您可以使用“虚拟编码”。有Python库可以进行伪编码,您可以选择几种方法。

您可以使用scikit-learn库。看看这里

或者,如果您使用熊猫,它具有内置函数来创建虚拟变量。检查一下

下面是一个有关熊猫的示例:

import pandas as pd

sample_data = [[1,2,'a'],[3,4,'b'],[5,6,'c'],[7,8,'b']]
df = pd.DataFrame(sample_data, columns=['numeric1','numeric2','categorical'])
dummies = pd.get_dummies(df.categorical)
df.join(dummies)
收藏
评论

是的,您必须将所有内容都转换为数字。这需要考虑这些属性代表什么。

通常有三种可能性:

  1. 一键式分类数据编码
  2. 序数数据的任意数字
  3. 使用类似组的方法来分类数据(例如,市区的平均价格)。

您必须谨慎,不要注入应用程序案例中没有的信息。

一种热编码

如果您有分类数据,则可以为每个可能的值创建具有0/1值的虚拟变量。

例如

idx color
0   blue
1   green
2   green
3   red

idx blue green red
0   1    0     0
1   0    1     0
2   0    1     0
3   0    0     1

这可以通过熊猫轻松完成:

import pandas as pd

data = pd.DataFrame({'color': ['blue', 'green', 'green', 'red']})
print(pd.get_dummies(data))

将导致:

   color_blue  color_green  color_red
0           1            0          0
1           0            1          0
2           0            1          0
3           0            0          1

序数编号

创建您的可分类类别的映射,例如,旧的<装修的<新的→0、1、2

大熊猫也可以这样做:

data = pd.DataFrame({'q': ['old', 'new', 'new', 'ren']})
data['q'] = data['q'].astype('category')
data['q'] = data['q'].cat.reorder_categories(['old', 'ren', 'new'], ordered=True)
data['q'] = data['q'].cat.codes
print(data['q'])

结果:

0    0
1    2
2    2
3    1
Name: q, dtype: int8

使用分类数据进行分组操作

您可以使用过去(已知事件)中每个类别的平均值。

假设您有一个数据框,其中最后一个已知的城市平均价格为:

prices = pd.DataFrame({
    'city': ['A', 'A', 'A', 'B', 'B', 'C'],
    'price': [1, 1, 1, 2, 2, 3],
})
mean_price = prices.groupby('city').mean()
data = pd.DataFrame({'city': ['A', 'B', 'C', 'A', 'B', 'A']})

print(data.merge(mean_price, on='city', how='left'))

结果:

  city  price
0    A      1
1    B      2
2    C      3
3    A      1
4    B      2
5    A      1
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号