from sklearn.linear_model import LinearRegression from sklearn.model_selection import GridSearchCV #利用线性回归和随机森林回归模型预测Age的值 age_nan = pd.DataFrame(train[['Age', 'Sex','SibSp', 'Fare', 'Pclass', 'Embarked']]) age_train = age_nan[age_nan.Age.notnull()] age_test = age_nan[age_nan.Age.isnull()] #线性回归 lr = LinearRegression() lr_grid_pattern = {'fit_intercept': [True], 'normalize': [True]} lr_grid = GridSearchCV(lr, lr_grid_pattern, cv=10, n_jobs=25, verbose=1, scoring='neg_mean_squared_error') lr_grid.fit(age_train.drop("Age",axis=1), age_train["Age"]) print('Age feature Best LR Params:' + str(lr_grid.best_params_)) print('Age feature Best LR Score:' + str(lr_grid.best_score_)) lr = lr_grid.predict(age_test.drop("Age",axis=1)) #随机森林回归 rfr = RandomForestRegressor() rfr_grid_pattern = {'max_depth': [3], 'max_features': [3]} rfr_grid = GridSearchCV(rfr, rfr_grid_pattern, cv=10, n_jobs=25, verbose=1, scoring='neg_mean_squared_error') rfr_grid.fit(age_train.drop("Age",axis=1), age_train["Age"]) print('Age feature Best LR Params:' + str(rfr_grid.best_params_)) print('Age feature Best LR Score:' + str(rfr_grid.best_score_)) rfr = rfr_grid.predict(age_test.drop("Age",axis=1)) #取二者均值 age_test["Age"] = (lr+rfr)/2 #定义年龄分级的函数 def age_level(s): if s <= 15 : #儿童 m = 0 elif s>15 and s<=30: #青年及少年 m = 1 elif s>30 and s<=60: #壮年 m = 2 else: #老年 m = 3 return m df["Age_level"] = df["Age"].apply(age_level)
时间: 2025-07-11 16:49:37 浏览: 13
<think>好的,我需要帮助用户了解如何使用线性回归和随机森林回归模型来预测Age特征的缺失值,并进行年龄分级。用户还希望结合GridSearchCV进行参数调优,并得到示例代码。现在我得仔细分析这个问题,并确保回答结构清晰、步骤正确。
首先,用户提到了使用LinearRegression和RandomForestRegressor,所以需要分别展示这两种模型的用法。同时,他们想用GridSearchCV来优化参数,因此需要说明如何将回归模型与网格搜索结合。另外,年龄分级可能是指将预测的连续年龄值转换为分类变量,比如儿童、青年、中年等,这需要分箱处理。
接下来,我需要考虑数据预处理的步骤。处理缺失值是关键,但用户已经提到要预测Age列的缺失值,所以可能需要先使用其他特征来预测缺失的Age值。这里可能需要先分离出有Age值和无Age值的数据,用有值的部分训练模型,然后预测缺失的部分。
然后,关于代码示例,需要导入必要的库,比如sklearn中的模型、GridSearchCV、预处理工具等。数据加载后,可能需要处理其他缺失值,比如用均值填充,但用户的问题可能假设其他特征已经处理好了,或者需要同时处理。需要明确步骤。
在模型训练部分,对于线性回归和随机森林,需要定义参数网格,比如正则化参数对于线性回归,n_estimators和max_depth对于随机森林。然后使用GridSearchCV进行交叉验证,找到最佳参数。
预测完成后,填充缺失的Age值,接着进行年龄分级。分箱可以使用pandas的cut函数,定义区间和标签。比如0-18为儿童,18-35为青年,35-60为中年,60以上为老年。
需要注意,在填充Age缺失值前,可能需要确保其他特征已经处理过缺失值,因为模型需要这些特征作为输入。例如,用户引用中的SimpleImputer可以用均值填充其他列的缺失值,然后再用回归模型预测Age。
另外,分类方法可能指的是将年龄分箱后的结果作为分类变量,用于后续的分类任务,或者仅仅是生成一个分级列。需要明确这一点,但根据用户的问题,可能只需展示如何分箱。
现在需要整合这些步骤,写出示例代码,并确保代码正确,符合sklearn的使用方法。同时,引用用户提供的参考文献,例如引用[1]关于线性回归类的构建,引用[4]关于SimpleImputer的使用。
可能的问题点包括:数据预处理是否正确,如何划分训练集和测试集(但这里可能不需要,因为是用已知的Age数据预测缺失的),特征的选择是否合适,是否需要标准化处理(对于线性回归通常需要)等。例如,线性回归对特征缩放敏感,所以可能需要StandardScaler,而随机森林不需要。但用户可能希望示例简洁,所以可能在代码中省略这些步骤,或者提到需要注意的地方。
最后,生成相关问题,可能需要围绕模型比较、参数调优、分箱方法、缺失值处理的其他技术等方面提问。</think>### 线性回归与随机森林回归填充Age缺失值及分级方法
#### 步骤说明
1. **数据预处理**
- 分离数据集:将`Age`列完整的数据作为训练集,缺失部分作为预测目标
- 对其他特征(如`Fare`, `SibSp`)使用`SimpleImputer`填充缺失值[^4]
- 对分类特征进行编码(如`Sex`, `Embarked`使用独热编码)
2. **模型构建与调参**
- **线性回归**:通过`GridSearchCV`优化正则化参数
- **随机森林回归**:调优树的数量和深度参数
3. **预测与填充**
- 使用最优模型预测缺失的`Age`值
- 合并完整数据集
4. **年龄分级**
- 通过分箱(`pd.cut`)将连续年龄转换为分类标签
---
#### 代码示例
```python
import pandas as pd
import numpy as np
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
# 加载数据并预处理
data = pd.read_csv('data.csv')
X = data.drop('Age', axis=1)
y = data['Age']
# 分离完整数据与缺失数据
known_age = data[data['Age'].notnull()]
unknown_age = data[data['Age'].isnull()]
# 构建预处理管道
numeric_features = ['Fare', 'SibSp']
categorical_features = ['Sex', 'Embarked']
preprocessor = ColumnTransformer(
transformers=[
('num', SimpleImputer(strategy='mean'), numeric_features),
('cat', OneHotEncoder(), categorical_features)
])
# 定义模型参数网格
models = {
'lr': (LinearRegression(), {'normalize': [True, False]}),
'rf': (RandomForestRegressor(),
{'n_estimators': [50, 100], 'max_depth': [3, 5]})
}
# 训练与预测
best_preds = []
for name, (model, params) in models.items():
full_pipeline = Pipeline([
('preprocessor', preprocessor),
('model', model)
])
# 网格搜索
grid = GridSearchCV(full_pipeline, params, cv=5)
grid.fit(known_age.drop('Age', axis=1), known_age['Age'])
# 预测缺失值
preds = grid.predict(unknown_age.drop('Age', axis=1))
best_preds.append(preds)
# 融合预测结果(取平均)
final_age = np.mean(best_preds, axis=0)
# 填充缺失值
data.loc[data['Age'].isnull(), 'Age'] = final_age
# 年龄分级
age_bins = [0, 18, 35, 60, 100]
labels = ['Child', 'Youth', 'Middle-aged', 'Senior']
data['Age_Group'] = pd.cut(data['Age'], bins=age_bins, labels=labels)
```
---
#### 核心要点
1. **特征工程**:分类特征需编码为数值(如`OneHotEncoder`),数值特征需填充缺失值[^4]
2. **模型选择**:
- 线性回归适合线性关系数据,计算效率高[^1]
- 随机森林可捕捉非线性关系,但需要更多计算资源
3. **结果融合**:取两种模型的预测均值可提升鲁棒性[^2]
4. **年龄分级**:分箱阈值应根据数据分布调整,可使用`pd.qcut`按分位数划分
---
阅读全文
相关推荐


















