我进行补充:这是输入地址D:\untitled1\Graduation project\two,文件名2024年全国A级景区数据.xlsx。输出地址为D:\untitled1\Graduation project\two\output要有平均绝对误差 (MAE)和决定系数 (R²)。请给我完整的机器预测模型的代码
时间: 2025-08-24 17:05:30 浏览: 2
<think>好的,我现在需要帮用户解决一个具体的机器学习预测模型构建的问题。用户的需求是使用Python实现一个完整的代码,输入是特定的Excel文件,输出到指定路径,并计算MAE和R²。首先,我需要回顾之前的对话历史,确保理解上下文。
用户之前提到了特征选择、处理策略,以及推荐了不同模型类型。现在用户希望得到一个完整的代码实现,所以需要整合之前的建议,比如特征处理、模型选择、评估指标等。用户可能已经有一定的数据处理基础,但可能需要详细的代码示例来指导整个流程。
首先,要确定输入输出路径。用户提供的路径是Windows格式,需要注意Python中路径的正确写法,可能需要使用双反斜杠或原始字符串。然后,读取Excel文件,这里使用pandas的read_excel函数即可。
接下来,数据预处理部分。根据之前的对话,用户的数据包括地理坐标、行政区划、景区属性等特征。需要统一坐标系,处理分类变量,可能还需要文本特征提取。例如,地理坐标标准化、省份城市等使用独热编码,地址文本使用TF-IDF或CountVectorizer。
模型选择方面,用户之前提到的随机森林、LightGBM等,这里可能需要选择一个合适的模型作为示例。考虑到易用性和常见性,可能先使用随机森林或梯度提升树。同时,用户需要评估指标MAE和R²,因此在模型训练后要计算这些指标,可能使用scikit-learn的cross_validate或者手动计算。
输出结果到指定目录,可能需要将模型保存、预测结果保存为Excel文件,同时评估结果保存为文本文件。这里需要注意路径存在性检查,如果目录不存在,需要自动创建,避免报错。
另外,用户可能需要代码的鲁棒性,例如处理缺失值、异常值等。但在示例代码中可能简化这些步骤,先确保主要流程正确,再建议用户根据实际数据情况进行调整。
特征工程部分,用户之前提到空间特征,如景点密度,可能需要使用NearestNeighbors来计算邻近景点的平均距离,这部分需要整合到预处理步骤中。但考虑到代码复杂度,可能先包括一个简单的特征工程示例,如计算景点密度,更复杂的空间回归可能需要额外库如pysal,但用户可能希望保持依赖简单,所以可能先使用基本方法。
模型调参部分,用户可能需要基本的参数设置,如n_estimators、max_depth等,但详细调参可能超出当前问题范围,所以示例中可能使用默认或常用参数,并建议用户根据需要进行优化。
最后,代码的结构需要清晰,步骤明确,包括数据读取、预处理、特征工程、模型训练、评估、结果保存。同时添加必要的注释,帮助用户理解各部分的功能。
可能遇到的问题包括路径错误、库未安装、数据列名不一致等,需要在代码中添加异常处理或提示用户检查数据格式。例如,使用try-except块捕获文件读取错误,或者提示用户确保输入文件存在。
需要确保所有使用的库都是常用的,如pandas, scikit-learn, xgboost, lightgbm等,如果用户未安装,可能需要提示安装命令。但考虑到用户可能已经具备环境,示例代码可能不包含安装步骤,但可以附上注释说明。
另外,用户可能需要将模型持久化,以便后续使用,因此添加模型保存的部分,使用joblib或pickle。同时,预测结果的保存格式要符合用户要求,如Excel文件。
评估指标方面,MAE和R²的计算需要使用sklearn.metrics中的相应函数,并在交叉验证或训练测试集中应用。用户可能需要详细的评估结果输出,如平均MAE和R²,以及每次交叉验证的结果。
最后,生成相关问题,可能需要围绕数据预处理、模型选择、超参数调优、结果分析等方面提问,帮助用户进一步深入。</think>根据您的需求,我为您构建了一个完整的机器学习预测模型实现方案,包含数据预处理、特征工程、模型训练和结果输出全流程。以下是详细代码实现:
```python
import os
import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder, OrdinalEncoder
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split, cross_validate
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error, r2_score
from sklearn.neighbors import NearestNeighbors
import joblib
# ====================
# 数据读取与路径配置
# ====================
input_path = r'D:\untitled1\Graduation project\two\2024年全国A级景区数据.xlsx'
output_dir = r'D:\untitled1\Graduation project\two\output'
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 读取数据(假设目标列为'游客量')
try:
df = pd.read_excel(input_path)
print(f"成功读取数据,形状:{df.shape}")
except Exception as e:
print(f"文件读取失败:{str(e)}")
exit()
# ====================
# 特征预处理
# ====================
# 1. 坐标系统一(示例保留WGS84坐标系)
df = df.rename(columns={
'坐标(WGS84)Lng': 'lng',
'坐标(WGS84)Lat': 'lat'
}).drop(columns=[c for c in df.columns if 'GCJ02' in c or 'BD09' in c])
# 2. 计算空间密度特征
coords = df[['lng', 'lat']].values
nbrs = NearestNeighbors(n_neighbors=5).fit(coords)
distances, _ = nbrs.kneighbors(coords)
df['景点密度'] = 1 / (distances.mean(axis=1) + 1e-6)
# 3. 划分特征和目标变量
X = df.drop(columns=['游客量']) # 请替换为实际目标列名
y = df['游客量']
# ====================
# 预处理管道
# ====================
preprocessor = ColumnTransformer([
# 数值特征标准化
('geo', StandardScaler(), ['lng', 'lat', '景点密度']),
# 分类特征编码(示例特征)
('cate', OneHotEncoder(handle_unknown='ignore'), ['省份', '城市', '等级']),
# 文本特征提取(地址信息)
('text', TfidfVectorizer(max_features=50), '地址')
])
# ====================
# 构建完整模型
# ====================
model = Pipeline([
('preprocessor', preprocessor),
('regressor', RandomForestRegressor(
n_estimators=200,
max_depth=10,
min_samples_leaf=5,
random_state=42
))
])
# ====================
# 模型训练与评估
# ====================
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 交叉验证
cv_results = cross_validate(
model, X_train, y_train,
cv=5,
scoring=['neg_mean_absolute_error', 'r2'],
return_train_score=True
)
# 全数据训练
model.fit(X_train, y_train)
# ====================
# 结果输出
# ====================
# 保存模型
joblib.dump(model, os.path.join(output_dir, 'tourism_predict_model.pkl'))
# 生成预测结果
test_pred = model.predict(X_test)
result_df = pd.DataFrame({
'实际值': y_test,
'预测值': test_pred,
'绝对误差': np.abs(y_test - test_pred)
})
# 保存预测结果
result_df.to_excel(os.path.join(output_dir, '预测结果.xlsx'), index=False)
# 评估指标输出
with open(os.path.join(output_dir, '性能报告.txt'), 'w') as f:
f.write("=== 交叉验证结果 ===\n")
f.write(f"训练集平均MAE: {-cv_results['train_neg_mean_absolute_error'].mean():.2f}\n")
f.write(f"验证集平均MAE: {-cv_results['test_neg_mean_absolute_error'].mean():.2f}\n")
f.write(f"验证集平均R²: {cv_results['test_r2'].mean():.2f}\n\n")
f.write("=== 测试集结果 ===\n")
f.write(f"MAE: {mean_absolute_error(y_test, test_pred):.2f}\n")
f.write(f"R²: {r2_score(y_test, test_pred):.2f}")
print("模型训练完成,结果已保存到指定目录")
```
阅读全文
相关推荐










