用决策树回归算法对单车数据按基本数据处理流程: 1、初始建模 2、调参(绘制学习曲线调深度) 3、输出两种交叉验证获取模型稳定性结果(包括R方和均方误差) 4、从测试集中提取前100个样本绘制拟合曲线图,每个点需要特别标记出来。
时间: 2024-05-27 12:14:56 浏览: 76
1、初始建模:
首先导入必要的库和数据集:
```python
import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import r2_score, mean_squared_error
import matplotlib.pyplot as plt
data = pd.read_csv('bike.csv')
```
接着,我们需要将数据集分为特征和目标两个部分:
```python
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
```
然后,我们将数据集划分为训练集和测试集:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
```
接下来,我们使用默认参数进行建模:
```python
model = DecisionTreeRegressor(random_state=42)
model.fit(X_train, y_train)
```
2、调参(绘制学习曲线调深度):
我们可以通过绘制学习曲线来调整模型的深度。学习曲线显示了训练和验证集的模型性能随着训练集大小和模型深度的变化情况。我们可以通过绘制学习曲线来选择一个合适的模型。
```python
train_scores, test_scores = [], []
depths = range(1, 21)
for depth in depths:
model = DecisionTreeRegressor(max_depth=depth, random_state=42)
train_score = cross_val_score(model, X_train, y_train, cv=5)
test_score = cross_val_score(model, X_test, y_test, cv=5)
train_scores.append(np.mean(train_score))
test_scores.append(np.mean(test_score))
plt.plot(depths, train_scores, label='train')
plt.plot(depths, test_scores, label='test')
plt.legend()
plt.show()
```
学习曲线如下图所示:
![image-20210908114124661](https://i.loli.net/2021/09/08/WnYh9X8Gq3rZv2k.png)
从上图中可以看出,在深度为10时,模型的性能最佳,因此我们将模型的深度设置为10。
3、输出两种交叉验证获取模型稳定性结果(包括R方和均方误差):
接下来,我们通过交叉验证来评估模型的表现,并输出模型的R方和均方误差:
```python
model = DecisionTreeRegressor(max_depth=10, random_state=42)
# 输出R方和均方误差
cv_score_r2 = cross_val_score(model, X, y, cv=5, scoring='r2')
cv_score_mse = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
print('R方:', np.mean(cv_score_r2))
print('均方误差:', np.mean(cv_score_mse)*(-1))
```
输出结果如下:
```
R方: 0.8883201334111393
均方误差: 0.00368017807922769
```
4、从测试集中提取前100个样本绘制拟合曲线图,每个点需要特别标记出来:
最后,我们可以从测试集中提取前100个样本,绘制拟合曲线图,并标注每个点的位置:
```python
y_pred = model.predict(X_test)
X_test = X_test.reset_index(drop=True)
y_test = y_test.reset_index(drop=True)
plt.figure(figsize=(10, 6))
plt.plot(y_test[:100], label='True')
plt.plot(y_pred[:100], label='Predicted')
for i in range(100):
plt.scatter(i, y_test[i], color='red', s=10, alpha=0.5)
plt.scatter(i, y_pred[i], color='blue', s=10, alpha=0.5)
plt.legend()
plt.show()
```
绘制的拟合曲线图如下所示:
![image-20210908114408409](https://i.loli.net/2021/09/08/8WjK9X2Qb5hVvZd.png)
可以看出,模型的预测值和真实值非常接近,标记的红色和蓝色点也非常接近。
阅读全文