#1.导入必备的库 import pandas as pd import numpy as np from matplotlib import pyplot as plt from scipy import stats from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score, KFold from sklearn.metrics import mean_squared_error, r2_score from sklearn.neighbors import KNeighborsRegressor from sklearn.preprocessing import StandardScaler #2.设置显示选项 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False pd.set_option('display.max_rows', None) #显示最大行数 pd.set_option('display.max_columns', None) #显示最大列数 pd.set_option('display.max_colwidth', None) #显示的最大列宽 pd.set_option('display.width', None) #显示的最宽度 #3.导入数据 data=pd.read_excel("信用评分卡模型.xlsx") #4.数据预处理 #4.1使用均值填写缺失值 print("缺失值统计:\n",data.isnull().sum()) data=data.apply(lambda col:col.fillna(col.mean()),axis=0) #4.2处理异常值 numeric_data = data.select_dtypes(include=[np.number]) z_scores = np.abs(stats.zscore(data.select_dtypes(include=[np.number]))) # 仅对数值型数据计算 Z-score threshold = 3 # Z-score 阈值 3个标准差 outliers = (z_scores > threshold).any(axis=1) # 检测异常值 print("检测到的异常值行索引:\n", data[outliers].index.tolist()) # 输出异常值的行索引 print(data[outliers]) data = data[~outliers] # 移除异常值 X=data.drop("信用评分",axis=1) y=data["信用评分"] #4.3将数据划分为训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=0) #4.4创建标准化训练测试集与训练集 scaler=StandardScaler() X_train=scaler.fit_transform(X_train) X_test=scaler.transform(X_test) #建立模型 model = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42) cv=KFold(n_splits=5, random_state=42, shuffle=True) # 参数网格 param_grid = { 'n_estimators': [50, 100, 200], 'learning_rate': [0.01, 0.1, 0.2], 'max_depth': [3, 5, 7] } # 网格搜索 grid_search = GridSearchCV( estimator=model, param_grid=param_grid, cv=cv, scoring='neg_mean_squared_error', n_jobs=-1 ) grid_search.fit(X_train, y_train) print("最佳参数组合:", grid_search
时间: 2025-06-15 18:09:28 浏览: 28
<think>好的,用户想要展示一个完整的机器学习项目流程,包括数据导入、预处理、特征工程、模型选择和调参,并且需要用到Python的pandas、numpy和scikit-learn库。我需要根据用户提供的引用内容来构建一个完整的示例代码,同时确保各部分步骤清晰,并且符合用户提到的所有要求。
首先,用户提到的引用[1]中有导入库的部分,包括numpy、matplotlib、train_test_split、LinearRegression和mean_squared_error。这可能对应数据导入、模型训练和评估部分。引用[2]提到了可视化,比如混淆矩阵,不过用户的问题是关于回归还是分类呢?暂时可能需要确定,但示例可能用回归更简单。引用[3]是关于Pandas的介绍,所以在数据导入和预处理部分需要用到Pandas。引用[4]是安装命令,但用户可能需要代码示例,这部分可能不需要包含,但需要确保库的导入正确。
接下来,我需要按照机器学习项目的标准流程来组织代码:
1. 数据导入:使用Pandas读取数据,比如从CSV文件。
2. 数据预处理:处理缺失值、数据分割、标准化等。
3. 特征工程:可能包括特征选择、创建新特征等。
4. 模型选择:选择一个模型,比如线性回归或随机森林。
5. 调参:使用GridSearchCV或RandomizedSearchCV进行超参数调优。
6. 模型评估:使用指标如均方误差、准确率等,并进行可视化。
需要注意用户提供的引用中的代码片段,比如引用[1]中的train_test_split和LinearRegression,引用[2]中的可视化方法,可能需要用回归或分类的例子。例如,如果是回归问题,可以用波士顿房价数据集,但该数据集在较新的sklearn版本中已被移除,可能需要改用加利福尼亚房价数据集。或者使用一个分类数据集,如鸢尾花数据集,这样可视化部分可以展示混淆矩阵。
考虑到用户可能希望示例完整,可能需要生成一个示例数据集,或者使用sklearn自带的某个数据集。假设使用加利福尼亚房价数据集(回归问题)或者鸢尾花数据集(分类问题)。这里可能选择回归问题,因为引用[1]中提到了均方误差,而分类问题可能更适合混淆矩阵。但需要看如何协调。
另外,用户需要特征工程,可能需要包括标准化、特征选择、多项式特征等步骤。例如,在预处理中使用StandardScaler,在特征工程中使用PolynomialFeatures。
模型选择部分可能需要比较不同的模型,但用户可能只需要一个示例,比如从线性回归切换到更复杂的模型,比如随机森林,并进行调参。调参部分可以使用GridSearchCV来调整参数,比如n_estimators、max_depth等。
在评估阶段,回归问题可以使用均方误差和R²分数,而分类问题使用准确率和混淆矩阵。根据引用[2],可能需要展示混淆矩阵的可视化,所以可能更适合分类问题。但需要检查引用中的代码是否适用于分类模型。比如,plot_confusion_matrix需要分类模型,而用户的问题可能更倾向于回归,但根据用户引用的内容,可能两者都需要考虑。或者选择一个分类问题,比如鸢尾花分类,这样可以使用混淆矩阵的可视化。
现在需要确定使用哪种数据集。假设使用鸢尾花数据集,这是一个多分类问题,包含4个特征,3个类别。这样预处理可能包括标准化,数据分割,特征工程可能包括特征选择或创建交互项,模型选择可以使用SVM或随机森林,调参调整超参数,最后评估使用准确率和混淆矩阵。
但用户的问题可能更倾向于回归,因为引用[1]中使用了线性回归和均方误差。或者可能用户希望一个综合的示例,可能需要明确。为了涵盖引用中的内容,可能选择一个回归问题,但可视化部分可能使用残差图或其他回归相关的图表,而引用[2]中的混淆矩阵可能不适用。或者用户可能希望混合示例,但这样可能不太合适。需要做出判断。
可能更安全的方式是使用一个回归问题,比如加利福尼亚房价数据集,这样数据导入、预处理、特征工程、模型选择(如线性回归、决策树回归等),调参,评估使用MSE和R²,可视化可能展示预测值与实际值的散点图,或者残差图。而引用[2]中的混淆矩阵可能不适用,但用户引用的内容可能只是作为参考,不一定需要完全对应。或者用户可能允许调整,所以需要灵活处理。
现在,开始构建示例代码的结构:
1. 数据导入:使用sklearn.datasets中的fetch_california_housing,然后用Pandas转换为DataFrame。
2. 数据预处理:检查缺失值(假设没有),分割为训练集和测试集,标准化特征。
3. 特征工程:可能进行多项式特征扩展,比如生成二次项。
4. 模型选择:先尝试线性回归,然后使用随机森林回归,比较性能。
5. 调参:对随机森林进行超参数调优,使用GridSearchCV。
6. 模型评估:计算MSE和R²,可视化预测结果与实际值的对比。
这样可以覆盖用户提到的各个步骤,并且使用到Pandas、numpy、sklearn等库,同时符合引用的内容。例如,在数据导入部分使用Pandas(引用[3]),预处理使用StandardScaler,特征工程使用PolynomialFeatures,模型选择使用LinearRegression和RandomForestRegressor,调参使用GridSearchCV,评估使用mean_squared_error(引用[1]),可视化使用matplotlib(引用[2]和[4])。
现在需要考虑代码的各个部分是否正确,是否符合最佳实践。例如,数据分割应该在特征工程之前还是之后?通常,在数据预处理时,应该先分割数据,避免数据泄漏。例如,标准化应该在训练集上进行fit,然后应用到测试集,而不是在整个数据集上标准化后再分割。同样,多项式特征应该在数据分割之后,仅对训练集进行fit,然后应用到测试集。因此,正确的流程应该是:
1. 导入数据,分割为X和y。
2. 分割为训练集和测试集。
3. 对训练集进行标准化、特征工程等操作,并应用到测试集。
4. 训练模型,调参,评估。
所以代码的结构可能需要调整,以确保没有数据泄漏。例如:
- 数据导入
- 分割为训练和测试
- 预处理:标准化
- 特征工程:多项式特征
- 模型训练
- 调参
- 评估
现在具体编写代码步骤:
数据导入:
from sklearn.datasets import fetch_california_housing
import pandas as pd
data = fetch_california_housing()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target
预处理:
X = df.drop('Target', axis=1)
y = df['Target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
特征工程:可能包括多项式特征,但需要注意,这应该在分割后进行,避免数据泄漏。例如:
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
poly = PolynomialFeatures(degree=2, include_bias=False)
X_train_poly = poly.fit_transform(X_train_scaled)
X_test_poly = poly.transform(X_test_scaled)
模型选择:先使用线性回归:
model = LinearRegression()
model.fit(X_train_poly, y_train)
y_pred = model.predict(X_test_poly)
mse = mean_squared_error(y_test, y_pred)
r2 = model.score(X_test_poly, y_test)
然后尝试随机森林:
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train_scaled, y_train)
y_pred_rf = rf.predict(X_test_scaled)
mse_rf = mean_squared_error(y_test, y_pred_rf)
r2_rf = rf.score(X_test_scaled, y_test)
调参部分:
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(RandomForestRegressor(random_state=42), param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train_scaled, y_train)
best_rf = grid_search.best_estimator_
y_pred_best = best_rf.predict(X_test_scaled)
mse_best = mean_squared_error(y_test, y_pred_best)
r2_best = best_rf.score(X_test_scaled, y_test)
可视化部分,可以绘制实际值与预测值的散点图:
import matplotlib.pyplot as plt
plt.scatter(y_test, y_pred_best)
plt.xlabel('Actual Values')
plt.ylabel('Predicted Values')
plt.title('Actual vs Predicted Values')
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'k--')
plt.show()
此外,可能还需要展示特征重要性:
feature_importances = best_rf.feature_importances_
features = X.columns
plt.barh(features, feature_importances)
plt.xlabel('Feature Importance')
plt.ylabel('Features')
plt.title('Random Forest Feature Importances')
plt.show()
这样整个流程就涵盖了数据导入、预处理、特征工程(多项式特征)、模型选择、调参和可视化。同时,代码中使用了Pandas、numpy(虽然隐式使用,但数据处理中可能用到)、sklearn的各种模块,符合用户的需求。
现在需要检查是否符合用户提供的引用内容:
引用[1]中的导入部分已经包含,如train_test_split、LinearRegression、mean_squared_error。引用[2]的可视化部分使用了matplotlib,符合要求。引用[3]关于Pandas的使用在数据导入时体现。引用[4]中的安装命令可能不需要包含在代码中,但用户可能已经安装这些库。
需要注意,用户可能希望特征工程部分更详细,比如处理缺失值、编码分类变量等,但在加利福尼亚数据集中可能不需要,因为特征都是数值型且没有缺失值。所以可能需要添加注释,说明在实际项目中可能需要处理这些步骤,但在此示例中数据较干净。
此外,用户可能希望看到完整的代码,所以需要将各部分整合成一个连贯的示例,并添加必要的注释。
最后,生成相关问题,例如关于数据预处理的步骤、调参方法的选择、特征工程的其他技术等。</think>以下是一个完整的机器学习项目流程示例,涵盖数据导入、预处理、特征工程、模型选择和调参,使用Python的Pandas、Numpy和Scikit-learn库实现。
```python
# === 1. 数据导入 ===
import pandas as pd
from sklearn.datasets import fetch_california_housing
# 加载加利福尼亚房价数据集
data = fetch_california_housing()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['MEDV'] = data.target # 添加目标变量列[^3]
# === 2. 数据预处理 ===
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
# 划分数据集
X = df.drop('MEDV', axis=1)
y = df['MEDV']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# === 3. 特征工程 ===
# 生成多项式特征(二次项)
poly = PolynomialFeatures(degree=2, include_bias=False)
X_train_poly = poly.fit_transform(X_train_scaled)
X_test_poly = poly.transform(X_test_scaled)
# === 4. 模型选择 ===
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
# 基础模型比较
models = {
"Linear Regression": LinearRegression(),
"Random Forest": RandomForestRegressor(n_estimators=100, random_state=42)
}
for name, model in models.items():
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
print(f"{name} MSE: {mean_squared_error(y_test, y_pred):.2f}, R²: {r2_score(y_test, y_pred):.2f}")
# === 5. 超参数调优 ===
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(RandomForestRegressor(random_state=42),
param_grid,
cv=5,
scoring='neg_mean_squared_error')
grid_search.fit(X_train_scaled, y_train)
# 获取最优模型
best_model = grid_search.best_estimator_
y_pred_best = best_model.predict(X_test_scaled)
print(f"Best Model MSE: {mean_squared_error(y_test, y_pred_best):.2f}")
# === 6. 结果可视化 ===
import matplotlib.pyplot as plt
# 绘制特征重要性
feature_importances = best_model.feature_importances_
sorted_idx = feature_importances.argsort()
plt.figure(figsize=(10,6))
plt.barh(range(X.shape[1]), feature_importances[sorted_idx], align='center')
plt.yticks(range(X.shape[1]), X.columns[sorted_idx])
plt.title("Feature Importance (Random Forest)")
plt.show()
```
**代码解析:**
1. **数据导入**:使用Pandas加载内置的加利福尼亚房价数据集[^3]
2. **预处理**:通过标准化处理消除特征量纲差异[^1]
3. **特征工程**:生成多项式特征以捕捉非线性关系
4. **模型选择**:比较线性回归和随机森林的基线表现
5. **调参优化**:使用网格搜索寻找随机森林最优参数组合[^2]
6. **可视化**:展示特征重要性帮助理解模型决策依据
阅读全文
相关推荐
















