如何使用 sklearn 从决策树模型中提高预测的准确性?

Posted

技术标签:

【中文标题】如何使用 sklearn 从决策树模型中提高预测的准确性?【英文标题】:How can I improve the accuracy of my prediction from a decision tree model using sklearn? 【发布时间】:2020-03-27 13:22:42 【问题描述】:

我使用 sklearn 在 Python 中创建了一个决策树模型,它从一个大型公共数据集中获取数据,该数据集将人为因素(年龄、体重指数、性别、吸烟等)与保险公司支付的医疗费用相关联年。我使用 0.2 的测试大小拆分数据集,但平均绝对误差和均方误差非常高。我尝试进行不同的拆分(0.5、0.8),但没有得到任何不同的结果。预测模型在某些方面似乎很不理想,但我不确定缺少哪些部分以及需要改进的部分。我附上了我的输出照片(通过 IMGUR 链接,因为我无法添加照片)以及我的代码,我感谢任何正确方向的指导!

https://imgur.com/a/6D74uB0

dataset = pd.read_csv('insurance.csv')

LE = LabelEncoder()
LE.fit(dataset.sex.drop_duplicates())
dataset.sex = LE.transform(dataset.sex)
LE.fit(dataset.smoker.drop_duplicates())
dataset.smoker = LE.transform(dataset.smoker)
LE.fit(dataset.region.drop_duplicates())
dataset.region = LE.transform(dataset.region)

print("Data Head")
print(dataset.head())
print()
print("Data Info")
print(dataset.info())
print()



for i in dataset.columns:
    print('Null Values in i :'.format(i = i) , dataset[i].isnull().sum())


X = dataset.drop('charges', axis = 1) 
y = dataset['charges'] 


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

regressor = DecisionTreeRegressor()  
regressor.fit(X_train, y_train)  

y_pred = regressor.predict(X_test) 

df = pd.DataFrame('Actual Value': y_test, 'Predicted Values': y_pred)  
print(df)

print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

【问题讨论】:

【参考方案1】:

Bootstrap Aggregating (https://en.wikipedia.org/wiki/Bootstrap_aggregating) 是一种减少估算器方差的简单方法。如果您已经在使用 sklearn 回归器,则几乎不需要额外的代码。下面是一个示例,说明如何使用简单袋装估计器来减少模型的方差:

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

regressor = DecisionTreeRegressor() 
b_regressor = BaggingRegressor(regressor, n_estimators = 100, max_features=3, max_samples=.5)  # get Boostrap aggregation ensemble regressor 

# Fit+predict using regular regressor
regressor.fit(X_train, y_train)  
y_pred = regressor.predict(X_test) 

# Fit predict using bootstrap aggregation
b_regressor.fit(X_train, y_train)  
y_b_pred = b_regressor.predict(X_test) 

df = pd.DataFrame('Actual Value': y_test, 'Predicted Values': y_pred, 'Bagging Predicted Values': y_b_pred)  
print(df)

print('Mean Absolute Error (Regular):', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error (Regular):', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error (Regular):', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

print('Mean Absolute Error (Bagging):', metrics.mean_absolute_error(y_test, y_b_pred))
print('Mean Squared Error (Bagging):', metrics.mean_squared_error(y_test, y_b_pred))
print('Root Mean Squared Error (Bagging):', np.sqrt(metrics.mean_squared_error(y_test, y_b_pred)))

【讨论】:

嗯,我实际上最终获得了更高的 MAE!我想知道我是否缺少某些东西。【参考方案2】:

您可以使用xgboost,这是使用提升算法。

【讨论】:

谢谢!我现在就调查一下!【参考方案3】:

如果你还没有做某些事情你可以做:

    在非分类列/特征上使用来自 scikit-learn 的 StandardScaler()。 使用 scikit-learn 中的 GridSearchCV 搜索适当的超参数,而不是手动进行。虽然,选择手动执行此操作可能会让您了解哪些参数值可能有效。 仔细检查DecisionTreeRegressor 的文档,确保您的实现与文档一致。

看看这是否有帮助。

【讨论】:

谢谢!我肯定遵循了文档,但我会研究 StandardScaler 和 GridSearchCV。 @Cassie 请考虑投票这个答案。感谢您选择它作为接受的答案。

以上是关于如何使用 sklearn 从决策树模型中提高预测的准确性?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习 | 决策树 (sklearn) 官方文档

决策树 Sklearn - 树的深度和准确性

我如何从决策树中预测 x_train 的位置获取叶子的节点号?

机器学习实验之肿瘤预测(决策树)

python-sklearn数据拆分与决策树的实现

使用sklearn python通过决策树提取数据点的规则路径