``` import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import GridSearchCV from sklearn.impute import SimpleImputer from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 读取数据 data = pd.read_excel(r"D:\homework\副本2组1.xlsx") # 检查缺失值 print("缺失值统计:") print(data.isnull().sum()) # 处理数据 data1 = data.copy() # 删除前两行(注意:确保列名未被删除) data1.drop(index=[0, 1], inplace=True) # 填充缺失值和替换'未检出' data1.fillna(0, inplace=True) data1.replace('未检出', 0, inplace=True) # 分离目标变量和特征 y = data1['Se'] X = data1.drop(columns=['Se'], axis=1) # 确保正确删除目标列 # 检查X的列名,确保不含'Se' print("\n处理后的特征列名:", X.columns.tolist()) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) numeric_features = X.select_dtypes(include=['int64', 'float64']).columns.tolist() categorical_features = X.select_dtypes(include=['object', 'category']).columns.tolist() rf = RandomForestRegressor(n_estimators=100, random_state=42) # 默认100棵树 rf.fit(X_train, y_train)```进行优化
时间: 2025-07-06 18:35:25 浏览: 9
<think>好的,我现在需要帮助用户优化他们提供的Python代码。首先,我得仔细看看他们的代码,了解他们做了什么,然后找出可以改进的地方。
用户的数据处理部分,他们用data1.drop删除了前两行,可能是因为数据中有无关的行。然后填充了缺失值和替换了'未检出'为0。这里可能有问题,比如直接用0填充是否合适?特别是对于数值型变量,可能应该用均值或中位数。而分类变量可能需要众数。此外,'未检出'可能代表低于检测限的值,替换为0可能合理,但也可以考虑用更小的值或者检测限的一半,这需要根据具体领域知识判断。
接下来,他们分离了目标变量Se,然后划分了训练集和测试集。这里注意到他们没有对分类变量进行处理,比如使用OneHotEncoder,但代码中似乎没有分类特征,因为后面的numeric_features和categorical_features可能为空。需要检查数据中的列类型是否正确,可能用户的数据中所有特征都是数值型,或者分类特征没有被正确识别。例如,如果有些列是字符串类型但被误判为数值型,或者反过来,这会导致后续处理出错。
然后,他们使用了RandomForestRegressor,但没有进行任何特征预处理,比如标准化或缺失值处理。不过,随机森林本身对特征的尺度不敏感,但如果有分类变量需要编码的话,就必须处理。此外,他们创建了numeric_features和categorical_features,但在代码中没有使用这些,可能是之前计划用ColumnTransformer但没完成。所以这里可能存在未使用的变量,或者预处理步骤缺失。
在模型训练部分,他们直接用了默认参数,可能没有调参,导致模型性能不佳。可以建议使用GridSearchCV或RandomizedSearchCV进行超参数优化。另外,他们没有评估模型的表现,比如计算MSE、MAE、R²等指标,这部分需要补充。
此外,代码中有一些可能的错误,比如删除前两行后是否重置了索引?如果没有,可能会在后续处理中出现问题。还有,数据读取时使用了硬编码路径,建议使用相对路径或者配置文件,但可能用户暂时不需要这部分优化。
还有,检查缺失值后打印了结果,但用户可能没有查看这些结果,直接填充了0,这可能导致数据失真。应该先分析缺失值的原因和比例,再决定处理方式。
总结下来,优化的方向可能有以下几点:
1. 数据预处理:
- 更合理的缺失值处理,比如用均值、中位数或众数填充。
- 处理'未检出'值,可能需要更合适的方法。
- 确保分类变量被正确识别和编码。
2. 特征工程:
- 使用ColumnTransformer和Pipeline来组织预处理步骤。
- 标准化数值特征(虽然随机森林不需要,但如果有其他模型可能需要)。
3. 模型训练与评估:
- 添加交叉验证和超参数调优。
- 计算并输出评估指标,如MSE、R²等。
4. 代码结构和可读性:
- 去除未使用的变量。
- 添加注释,提高代码可维护性。
- 可能将部分代码封装成函数,方便复用。
接下来,我需要一步步将这些优化点转化为具体的代码修改建议,并确保符合用户的要求,比如使用中文注释,保持结构清晰。同时,要确保LaTeX格式的正确应用,比如在数学公式部分使用$...$或$$...$$。</think>我将分步骤为您优化这段代码,并解释每个改进点的作用:
$$改进方案 = 数据预处理优化 + 特征工程优化 + 模型调优 + 评估体系完善$$
一、数据预处理优化
```python
# 缺失值处理优化
missing_values = data.isnull().sum()
print(f"缺失值占比:\n{missing_values/len(data)*100:.2f}%")
# 创建智能填充器(根据缺失比例动态处理)
def smart_imputer(df, threshold=50):
for col in df.columns:
missing_percent = df[col].isnull().mean() * 100
if missing_percent > threshold:
df.drop(col, axis=1, inplace=True)
elif missing_percent > 0:
if df[col].dtype == 'object':
df[col].fillna('Unknown', inplace=True)
else:
median = df[col].median()
df[col].fillna(median, inplace=True)
return df
data = smart_imputer(data)
```
二、特征工程优化
```python
# 创建自动化特征工程管道
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
```
三、模型调优与评估
```python
# 创建优化后的建模管道
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('regressor', RandomForestRegressor(random_state=42))])
# 超参数网格搜索
param_grid = {
'regressor__n_estimators': [100, 200],
'regressor__max_depth': [None, 10, 20],
'regressor__min_samples_split': [2, 5],
'regressor__min_samples_leaf': [1, 2]
}
grid_search = GridSearchCV(pipeline, param_grid, cv=5,
scoring='neg_mean_squared_error',
n_jobs=-1)
grid_search.fit(X_train, y_train)
# 模型评估
def evaluate_model(model, X_test, y_test):
y_pred = model.predict(X_test)
metrics = {
'MAE': mean_absolute_error(y_test, y_pred),
'RMSE': np.sqrt(mean_squared_error(y_test, y_pred)),
'R²': r2_score(y_test, y_pred)
}
print(f"最佳参数: {model.best_params_}")
print("评估指标:")
for name, value in metrics.items():
print(f"{name}: {value:.4f}")
return metrics
metrics = evaluate_model(grid_search, X_test, y_test)
```
四、可视化增强
```python
# 特征重要性可视化
feature_importances = grid_search.best_estimator_.named_steps['regressor'].feature_importances_
feature_names = numeric_features + list(grid_search.best_estimator_.named_steps['preprocessor']\
.named_transformers_['cat'].named_steps['onehot']\
.get_feature_names_out(categorical_features))
plt.figure(figsize=(12, 8))
sns.barplot(x=feature_importances, y=feature_names)
plt.title('特征重要性排名')
plt.xlabel('重要性分数')
plt.ylabel('特征名称')
plt.show()
```
改进说明:
1. 数据预处理
- 引入缺失值比例阈值处理:当某列缺失值超过$50\%$时自动删除该列
- 使用中位数填充数值特征,避免简单填$0$带来的偏差
- 对分类特征采用「Unknown」填充,保留信息完整性
2. 特征工程
- 建立标准化处理流程:对数值特征执行$z-score$标准化
$$z = \frac{x - \mu}{\sigma}$$
- 实现自动化分类编码:使用One-Hot编码处理分类变量
3. 模型优化
- 引入网格搜索寻找最优超参数组合
- 交叉验证提升模型泛化能力(设置$cv=5$)
- 增加并行计算加速训练($n\_jobs=-1$)
4. 评估体系
- 计算$MAE$, $RMSE$, $R^2$三项核心指标
$$RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2}$$
$$R^2 = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2}$$
- 可视化特征重要性,帮助理解模型决策过程
建议后续优化方向:
1. 添加特征选择步骤(如递归特征消除)
2. 尝试其他回归模型(如XGBoost、LightGBM)进行对比
3. 增加特征交互项或多项式特征
4. 实现自动化超参数优化(如Optuna框架)
阅读全文
相关推荐


















