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)