如何使用 sklearn 提高决策树模型的预测准确性?
How can I improve the accuracy of my prediction from a decision tree model using sklearn?
我使用 sklearn 在 Python 中创建了一个决策树模型,它从与人为因素(年龄、体重指数、性别、吸烟等)相关的大型 public 数据集中获取数据保险公司每年支付的医疗费用。我用 0.2 的测试大小拆分数据集,但平均绝对误差和均方误差非常高。我尝试进行不同的拆分 (.5, .8),但没有得到任何不同的结果。预测模型在某些方面似乎有很大的偏差,但我不确定缺少哪些部分以及需要改进的地方。我附上了我的输出照片(通过 IMGUR link,因为我无法添加照片)以及我的代码,我感谢任何正确方向的指导!
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)))
如果您还没有做,您可以做的某些事情:
- 在非分类 columns/features 上使用来自 scikit-learn 的
StandardScaler()
。
- 使用 scikit-learn 中的
GridSearchCV
搜索合适的超参数,而不是手动执行。虽然,选择手动执行此操作可能会让您了解哪些参数值可能有效。
- 仔细检查
DecisionTreeRegressor
的文档,确保您的实施与文档一致。
看看这是否有帮助。
您可以使用xgboost
,这是使用提升算法。
Bootstrap 聚合 (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)))
我使用 sklearn 在 Python 中创建了一个决策树模型,它从与人为因素(年龄、体重指数、性别、吸烟等)相关的大型 public 数据集中获取数据保险公司每年支付的医疗费用。我用 0.2 的测试大小拆分数据集,但平均绝对误差和均方误差非常高。我尝试进行不同的拆分 (.5, .8),但没有得到任何不同的结果。预测模型在某些方面似乎有很大的偏差,但我不确定缺少哪些部分以及需要改进的地方。我附上了我的输出照片(通过 IMGUR link,因为我无法添加照片)以及我的代码,我感谢任何正确方向的指导!
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)))
如果您还没有做,您可以做的某些事情:
- 在非分类 columns/features 上使用来自 scikit-learn 的
StandardScaler()
。 - 使用 scikit-learn 中的
GridSearchCV
搜索合适的超参数,而不是手动执行。虽然,选择手动执行此操作可能会让您了解哪些参数值可能有效。 - 仔细检查
DecisionTreeRegressor
的文档,确保您的实施与文档一致。
看看这是否有帮助。
您可以使用xgboost
,这是使用提升算法。
Bootstrap 聚合 (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)))