[英]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 或科學問題,因為它與編程無關。 但這里有一些提示:
順便說一句,您的低准確率主要是由於第 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.