数据预处理与特征工程
在机器学习项目中,数据预处理和特征工程是至关重要的步骤。原始数据往往包含噪声、缺失值以及不适合直接输入模型的特征。通过合理的预处理和特征转换,可以显著提升模型的性能。
1. 数据清洗
数据清洗包括处理缺失值、去除异常值以及修正数据错误。以常见的房价预测数据集为例,首先加载数据并检查缺失情况:
import pandas as pd
# 加载数据集
data = pd.read_csv('housing_data.csv')
# 查看缺失值情况
print(data.isnull().sum())
对于数值型缺失值,常用的处理方法包括均值填充或中位数填充:
# 填充数值型缺失值
data['total_bedrooms'].fillna(data['total_bedrooms'].mean(), inplace=True)
对于分类变量的缺失值,可以使用众数填充:
# 填充分类变量缺失值
data['ocean_proximity'].fillna(data['ocean_proximity'].mode()[0], inplace=True)
2. 特征编码
将分类变量转换为数值形式是模型能够处理的前提。常用的方法有独热编码(One-Hot Encoding)和标签编码(Label Encoding)。例如,对ocean_proximity进行独热编码:
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(drop='first', sparse=False)
encoded_features = encoder.fit_transform(data[['ocean_proximity']])
# 将编码后的特征拼接回原数据
data = data.drop('ocean_proximity', axis=1)
data = pd.concat([data, pd.DataFrame(encoded_features, columns=encoder.get_feature_names_out())], axis=1)
3. 特征缩放
许多机器学习算法对特征的尺度敏感,因此进行特征缩放是必要的。常用的方法包括标准化(Standardization)和归一化(Normalization)。以标准化为例:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_features = scaler.fit_transform(data[['total_bedrooms', 'population', 'median_income']])
# 替换原特征
data.loc[:, ['total_bedrooms', 'population', 'median_income']] = scaled_features
模型选择与训练
选择合适的模型并进行训练是机器学习流水线的核心部分。不同的任务和数据特性适合不同的模型。以下以线性回归和随机森林为例,展示如何选择和训练模型。
1. 线性回归模型
线性回归适用于预测连续值,且假设特征与目标之间存在线性关系。使用scikit-learn库可以轻松实现:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 划分训练集和测试集
X = data.drop('median_house_value', axis=1)
y = data['median_house_value']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化并训练模型
linear_reg = LinearRegression()
linear_reg.fit(X_train, y_train)
# 预测
y_pred = linear_reg.predict(X_test)
2. 随机森林模型
随机森林是一种集成学习方法,适用于处理非线性关系和高维数据。其实现同样简便:
from sklearn.ensemble import RandomForestRegressor
# 初始化并训练模型
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
# 预测
y_pred_rf = rf.predict(X_test)
模型评估与验证
评估模型的性能是确保其泛化能力的关键。常用的评估指标包括均方误差(MSE)、决定系数(R²)等。以下以MSE为例,比较线性回归和随机森林的表现:
from sklearn.metrics import mean_squared_error
# 计算MSE
mse_linear = mean_squared_error(y_test, y_pred)
mse_rf = mean_squared_error(y_test, y_pred_rf)
print(f"Linear Regression MSE: {mse_linear}")
print(f"Random Forest MSE: {mse_rf}")
通过对比可以发现,随机森林在该数据集上的表现优于线性回归,这可能由于数据中存在非线性关系。
超参数调优与交叉验证
为了进一步提升模型性能,超参数调优是必不可少的步骤。常用的方法包括网格搜索(Grid Search)和随机搜索(Random Search)。以下以随机森林为例,使用网格搜索寻找最佳参数:
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5, 10]
}
# 初始化GridSearchCV
grid_search = GridSearchCV(RandomForestRegressor(random_state=42), param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
# 输出最佳参数
print(f"Best Parameters: {grid_search.best_params_}")
print(f"Best CV MSE: {-grid_search.best_score_}")
通过交叉验证,可以更可靠地评估模型在不同数据拆分下的表现,从而选择出最优的超参数组合。
模型持久化与部署
训练好的模型需要保存以便后续使用或部署。joblib库提供了高效的模型持久化方法:
import joblib
# 保存模型
joblib.dump(grid_search.best_estimator_, 'random_forest_model.pkl')
# 加载模型
loaded_model = joblib.load('random_forest_model.pkl')
部署阶段,可以将模型集成到Web应用或API中,使用框架如Flask或FastAPI进行服务化:
from flask import Flask, request, jsonify
app = Flask(__name__)
# 加载模型
model = joblib.load('random_forest_model.pkl')
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json()
features = pd.DataFrame(data)
prediction = model.predict(features)
return jsonify({'prediction': prediction.tolist()})
if __name__ == '__main__':
app.run(debug=True)

822

被折叠的 条评论
为什么被折叠?



