回归算法似乎正在处理以数字表示的特征。 例如:
此数据集不包含分类要素/变量。很清楚如何对这些数据进行回归并预测价格。
但现在我想对包含分类特征的数据进行回归分析:
5 功能:District
,Condition
,Material
,Security
,Type
如何对此数据进行回归?我是否必须手动将所有这些字符串/分类数据转换为数字?我的意思是,如果我必须创建一些编码规则,并根据该规则将所有数据转换为数值。有没有简单的方法将字符串数据转换为数字而无需手动创建自己的编码规则?可能有 Python 中的一些库可用于此吗?由于编码错误"?
,回归模型是否存在某种风险?答案 0 :(得分:58)
是的,您必须将所有内容转换为数字。这需要考虑这些属性代表什么。
通常有三种可能性:
您必须小心谨慎,不要在申请案件中注入您没有的信息。
如果您有分类数据,则可以为每个可能的值创建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
这可以通过pandas轻松完成:
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
创建可排序类别的映射,例如: G。 旧的<翻新<新→0,1,2
pandas也可以这样做:
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
您可以使用过去(已知事件)中每个类别的均值。
假设您有一个DataFrame,其中包含城市的最新已知平均价格:
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
答案 1 :(得分:8)
在这种情况下,您可以使用“虚拟编码”。 有Python库可以进行虚拟编码,你有几个选择。
您可以使用scikit-learn库。看看here。
或者,如果你使用pandas,它有一个内置函数来创建虚拟变量。检查this。
pandas的一个例子如下:
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)
答案 2 :(得分:4)
在带有分类变量的线性回归中,应注意“虚拟变量陷阱”。虚拟变量陷阱是其中自变量是多重共线性的场景,即两个或多个变量高度相关的场景。简单来说,可以从其他变量中预测一个变量。这会产生模型的奇异性,这意味着您的模型将无法工作。 Read about it here
想法是使用带有drop_first=True
的伪变量编码,在将类别变量转换为伪变量/指标变量之后,这将在每个类别中省略一列。您这样做不会不会丢失任何相关信息,这仅仅是因为数据集的所有点都可以由其余功能完全解释。
以下是有关如何针对住房数据集进行处理的完整代码
因此,您具有分类功能:
District, Condition, Material, Security, Type
以及您要预测的一个数值特征:
Price
首先,您需要将初始数据集拆分为输入变量和预测,并假设其熊猫数据框如下所示:
输入变量:
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)
答案 3 :(得分:0)
如上所述,使用分类变量作为自变量来实现回归的一种方法是-使用编码。 另一种方法是通过使用statmodels库使用R之类的统计公式。这是一个代码段
from statsmodels.formula.api import ols
tips = sns.load_dataset("tips")
model = ols('tip ~ total_bill + C(sex) + C(day) + C(day) + size', data=tips)
fitted_model = model.fit()
fitted_model.summary()
数据集
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
回归摘要