簡體   English   中英

Sklearn分類與DecisionTree,如何提高擬合?

[英]Sklearn classification with DecisionTree, how to improve fit?

這是我第一次進行數據分析,我正在嘗試執行分類問題。 我正在嘗試預測汽車的價格。 我有以下 DataFrame (已清理):

price   vehicleType yearOfRegistration  gearbox powerPS model   kilometer   fuelType    brand   notRepairedDamage
2   9000    suv 2004    automatik   163 grand   125000  diesel  jeep    not-declared
3   1500    kleinwagen  2001    manuell 75  golf    150000  benzin  volkswagen  nein
4   3000    kleinwagen  2008    manuell 69  fabia   90000   diesel  skoda   nein
6   1500    cabrio  2004    manuell 109 2_reihe 150000  benzin  peugeot nein
8   12500   bus 2014    manuell 125 c_max   30000   benzin  ford    not-declared
... ... ... ... ... ... ... ... ... ... ...
371520  3000    limousine   2004    manuell 225 leon    150000  benzin  seat    ja
371524  1000    cabrio  2000    automatik   101 fortwo  125000  benzin  smart   nein
371525  9000    bus 1996    manuell 102 transporter 150000  diesel  volkswagen  nein
371526  3000    kombi   2002    manuell 100 golf    150000  diesel  volkswagen  not-declared
371527  25000   limousine   2013    manuell 320 m_reihe 50000   benzin  bmw nein

因此,如您所見,存在分類屬性。 因此我必須對它們進行編碼。 我是這樣做的:

encoding = DataFrameMapper([
    (['vehicleType', 'gearbox', 'model', 'fuelType', 'brand', 'notRepairedDamage'], 
      OneHotEncoder(handle_unknown='ignore')),    
    (["yearOfRegistration", "powerPS", "kilometer"], OneHotEncoder(handle_unknown='ignore'))
    ])

encoding_target = DataFrameMapper([
    (['price'], None)
])

在這里我應該提到我有一個名為“名稱”的列,其中包含汽車的名稱和可選內容。 我不得不放棄它,因為 dataframe 有 250k 行,如果我也嘗試對該列進行編碼,我會得到 Memory 錯誤。

然后我進行了擬合和改造:

encoding.fit(data)
encoding_target.fit(data)

X = encoding.transform(data.loc[:, data.columns != "price"])
y = encoding_target.transform(data[['price']])

然后我創建了訓練/測試拆分

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .2, random_state = 0)

然后將決策樹構造函數稱為:

tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
y_pred = tree.predict(X_test)
accuracy_score(y_test, y_pred)

我的分數是 0.38。 這真的很低。 所以,我想問你問題是否在於我如何編碼 dataframe 以將其與 sklearn 一起使用。 是的,有沒有更好的方法? 這樣我也有交叉驗證的問題,我不覺得 dataframe 完全可以與其他算法一起使用。 謝謝:)

我不確定這是 Stackoverflow 問題而不是 stackexchange 或科學問題,因為它與編程無關。 但這里有一些提示:

  1. 您不需要對 y 變量進行編碼,大多數 sklearn 會將其轉換為數字。 如果沒有,只需為映射設置一組(如果它們是分類的)。
  2. 算法幾乎不可能獲得高數字作為預測。 嘗試將您的 y 變量轉換為其他內容。 (即:X 個周期后高於或低於 10k 或 % 增長)。
  3. 當您的 y-categorical-variable 有超過 2 個選項時,在 train_test_split 中設置“stratify=y”參數)

順便說一句,您的低准確率主要是由於第 2 條。

編輯:剛剛看到您的稱贊,您的 y 分為 12 個間隔。 因此,您應該混合使用所有提示。 創建一個新的 y 變量,類似於if price between 0 and 1k then 0, elif between 1k and 3k then 1 (and so on..) ,可能使用 panda's.loc()。

如果您要預測汽車的價格, price是您的目標特征,因此它通常是回歸問題,而不是分類問題。 分類 model 不知道 1000 比 25000 更接近 1500 - 它只是將它們視為單獨的類。 您是 model 在預測 class 價格時的准確度為 0.38。

嘗試DecisionTreeRegressor()代替。 您可以查看其中一些指標: https://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM