12

回归算法似乎在处理以数字表示的特征。 例如:带字符串/分类特征(变量)的线性回归分析?

enter image description here

此数据集不包含类别特征/变量。如何对这些数据进行回归并预测价格非常明确。


但现在我想做的数据回归分析中包含类别特征:

enter image description here

有特点:DistrictConditionMaterialSecurityType


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

回答

26

是的,你将不得不一切转换为数字。这需要考虑这些属性代表什么。

通常有三种可能性:

分类数据
  • 为序数据
  • 任意数字
  • 使用类似组用于分类数据
    1. 一位热码编码(例如,平均值为全市各区的价格) 。

    你必须小心,不要注入应用案例中没有的信息。

    一个炎热的编码

    如果你有明确的数据,您可以创建为每个可能值0/1值虚拟变量。

    E.g。

    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 
    

    编号为序数据

    创建可排序类别的映射, G。 老<装修<新→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 
    

    用分类数据GROUPBY操作

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

    说你有最后已知的平均价格为数据帧城市:

    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 
    
  • +0

    却怎么hotencoding帮助你时,你会试图预测新的颜色?也许在你的情况下,你必须重新训练模型。你有任何解决方案? – gtzinos

    3

    在这种情况下,您可以使用“虚拟编码”。 有虚拟编码的Python库,你有几个选项。

    您可以使用scikit-learn库。看看here。或者,如果您使用熊猫,它具有创建虚拟变量的内置函数。检查this

    与大熊猫下面是一个例子:

    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)