回归算法似乎只能处理以数字表示的特征。例如:
这个数据集不包含分类特征/变量。很明显如何在这个数据上进行回归并预测价格。
但现在我想对包含分类特征的数据进行回归分析:
有5个特征:District
,Condition
,Material
,Security
,Type
我如何在这个数据上进行回归?我是否必须手动将所有字符串/分类数据转换为数字?我是说我是否需要创建一些编码规则,并根据这些规则将所有数据转换为数值。
有没有简单的方法可以将字符串数据转换为数字,而不必手动创建自己的编码规则?也许有Python中的一些库可以用来做这个?是否存在由于“错误编码”导致回归模型不正确的风险?
回答:
是的,你需要将所有数据转换为数字。这需要考虑这些属性代表什么。
通常有三种可能性:
- 分类数据的一热编码
- 序数数据的任意数字
- 使用分类数据的组均值(例如,城市区域的平均价格)。
你必须小心不要引入在应用案例中没有的信息。
一热编码
如果你有分类数据,你可以为每个可能的值创建0/1值的虚拟变量。
例如:
idx color0 blue1 green2 green3 red
转换为
idx blue green red0 1 0 01 0 1 02 0 1 03 0 0 1
这可以很容易地使用pandas完成:
import pandas as pddata = pd.DataFrame({'color': ['blue', 'green', 'green', 'red']})print(pd.get_dummies(data))
结果将是:
color_blue color_green color_red0 1 0 01 0 1 02 0 1 03 0 0 1
序数数据的数字
创建一个可排序类别的映射,例如旧 < 翻新 < 新 → 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.codesprint(data['q'])
结果:
0 01 22 23 1Name: 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 price0 A 11 B 22 C 33 A 14 B 25 A 1