首页 > 解决方案 > Sklearn分类与DecisionTree,如何提高拟合?

问题描述

这是我第一次进行数据分析,我正在尝试执行分类问题。我试图预测汽车的价格。我有以下 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)
])

在这里我应该提到我有一个名为“名称”的列,其中包含汽车的名称和可选内容。我不得不放弃它,因为数据帧有 250k 行,如果我也尝试对该列进行编码,我会得到内存错误。

然后我进行了拟合和改造:

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。这真的很低。所以,我想问你问题是否在于我如何编码数据帧以将其与 sklearn 一起使用。是的,有没有更好的方法?这样我也有交叉验证的问题,我不觉得数据框完全可以与其他算法一起使用。谢谢 :)

标签: pythonmachine-learningscikit-learnregression

解决方案


如果您要预测汽车的价格price,那么它是您的目标特征,因此通常是回归问题,而不是分类问题。分类模型不知道 1000 比 25000 更接近 1500 - 它只是将它们视为单独的类。您的模型在预测价格类别时的准确度为 0.38。

试试DecisionTreeRegressor()吧。您可以查看其中一些指标:https ://scikit-learn.org/stable/modules/model_evaluation.html#regression-metrics


推荐阅读