东京Airbnb数据建模与优化实践
立即解锁
发布时间: 2025-09-10 01:24:42 阅读量: 4 订阅数: 19 AIGC 


表格数据机器学习实战
### 东京Airbnb数据建模与优化实践
#### 1. 数据存储
在进行模型构建之前,我们需要将处理后的特征和目标变量存储到一个CSV文件中,后续在测试深度学习解决方案并与本章训练的XGBoost模型进行性能比较时会再次使用这些数据。以下是实现代码:
```python
data = pd.DataFrame(
Xt,
columns=column_transform.get_feature_names_out(),
index=y.index
)
data = data.assign(target=y).reset_index()
data.to_csv("airbnb_tokyo.csv", index=False)
```
#### 2. 构建基线模型
在机器学习中,构建基线模型具有重要意义,主要体现在以下几个方面:
- **性能比较**:作为基准,对比更复杂模型的性能,判断增加模型复杂度是否有价值。
- **过拟合检测**:通过与基线模型在未见过数据上的性能对比,识别高级模型是否过拟合。
- **问题理解**:创建简单的基线模型,尤其是线性模型,有助于更好地理解数据和问题。
- **调试与验证**:验证数据预处理流程的正确性,因为变量对模型的影响不会被模型的复杂性所掩盖。
- **提供最小可行模型**:为当前问题提供一个最小可行的解决方案。
因此,我们不会直接使用梯度提升模型进行训练,而是先测试一个简单的线性模型。这里采用交叉验证预测的方法,该方法通过在交叉验证的验证折叠上进行预测,为所有训练案例提供无偏预测。以下是线性回归基线模型的代码:
```python
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
lm = LinearRegression(fit_intercept=False)
lm.fit(Xt, y)
cv_splits = cv.split(
X,
y = X["neighbourhood_more_than_30"]
)
y_pred_cv = cross_val_predict(
lm, Xt, y, cv=cv_splits
)
prediction_range = f"{y_pred_cv.min()} - {y_pred_cv.max()}"
print(f"prediction range: {prediction_range}")
r2 = r2_score(y, y_pred_cv)
rmse = np.sqrt(mean_squared_error(y, y_pred_cv))
mae = mean_absolute_error(y, y_pred_cv)
print(f'R-squared: {r2:.3f}')
print(f'RMSE: {rmse:.3f}')
print(f'MAE: {mae:.3f}')
plt.scatter(y, y_pred_cv)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='Ideal Fit')
plt.axhline(
0, color='orange', linestyle='--', label='Zero Line'
)
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.title('Linear Regression - Fitted Results')
plt.legend()
plt.show()
```
运行代码后,我们得到以下评估结果:
| 评估指标 | 值 |
| ---- | ---- |
| 预测范围 | -34929.50241836217 - 136479.60736257263 |
| R-squared | 0.320 |
| RMSE | 17197.323 |
| MAE | 12568.371 |
可以看出,线性回归模型的预测存在负值,MAE较高,R-squared仅为0.32,拟合效果不太理想。通过检查预测结果,我们发现约0.5%的预测值小于等于零,同时定位到了正异常值(案例5509和8307)和负异常值(案例182)。为了进一步分析异常值,我们定义了一个检查函数:
```python
def report_case(model, data, feature_names, case_no):
case_values = data[case_no]
coef_values = case_values * model.coef_
for feature_name, value, coef_value in zip(
feature_names, case_values, coef_values):
print(f"{feature_name:50s}" +
f"({value:10.2f}) : " +
f"{coef_value:+0.2f}")
print("-" * 80)
print(" "*66 + f"{np.sum(coef_values):+0.2f}")
```
以案例8307为例,使用该函数分析后发现,卧室数量的高值是导致预测成为异常值的主要原因。这表明线性模型对每个特征进行线性建模,特征的预测贡献无界,引入非线性和交互作用可以缓解此类问题。
#### 3. 构建首个尝试模型
基于之前的探索性数据分析(EDA)和基线模型检查,我们选择XGBoost回归器构建首个尝试模型。使用`gamma`目标函数,适用于建模正的连续变量,这些变量通常是正偏态的。同时,考虑到基线模型存在欠拟合和无法正确处理交互或线性关系的问题,我们将决策树的最大深度设置为最多6层。以下是代码实现:
```python
from sklearn.model_selection import cross_validate
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from xgboost import XGBRegressor
xgb = XGBRegressor(booster='gbtree',
```
0
0
复制全文
相关推荐










