一、问题分析与理解
(一)明确问题类型
一个模型出现的意义大部分都是预测。比如说鸢尾花的分类预测呀,或者波士顿的房价预测啦,都是根据已有的数据来预测未知的数据,具体的训练过程是交给计算机学习的,这便是机器学习。
所以我们在拿到一个项目的时候,我们需要先知道我们的目的是什么,明确要预测的结果是什么,例如泰坦尼克号乘客生存分析中的 “Survived” 字段,表示乘客是否幸存;鸢尾花分析中的花的类别;房价预测分析中的房价数值。
关键就是:判断是分类问题(如泰坦尼克号乘客生存预测,结果为幸存或未幸存两类)、回归问题(如房价预测,预测连续的房价数值)还是其他类型问题(如聚类问题等)。
(二)数据初步探索
使用合适的库(如 pandas)将数据集读入程序。对于不同格式的数据(如 CSV、Excel 等),使用相应的读取函数。
代码示例(以泰坦尼克号为例):
import pandas as pd
# 训练数据集
train = pd.read_csv('train.csv')
# 测试数据集
test = pd.read_csv('test.csv')
print('训练数据集:', train.shape, '测试数据集:', test.shape)
也许你不会很想点开那些极为庞大的.csv文件,这个时候你可以用以下的几行代码了解你的材料的大致信息:
# 查看训练数据集的前几行数据
print(train.head())
# 查看训练数据集的信息(包括数据类型、非空值数量等)
print(train.info())
# 查看训练数据集的统计信息(数值型列的计数、均值、标准差等)
print(train.describe())
其实我更推荐你可视化这些数据。对于数值型特征,绘制直方图、箱线图等可以直观地观察数据的分布情况,有助于发现异常值、数据偏态等问题;对于分类特征,可以绘制柱状图等查看各类别的比例。
以泰坦尼克号 Age 列为例绘制直方图:
import matplotlib.pyplot as plt
plt.hist(train['Age'].dropna(), bins=20)
plt.xlabel('Age')
plt.ylabel('Frequency')
plt.show()
绘图效果如下所示:
二、数据清洗与预处理
(一)缺失值处理
你在网上爬取的数据,或者是你的同事交给你的文件也许对于计算机不是很好读取。也许存在着缺失值,异常值等等。这个时候你需要先查找缺失值,再处理这些缺失值。
# 查找训练集中的缺失值数量
print(train.isnull().sum())
# 填充Age的缺失值为均值
train['Age'].fillna(train['Age'].mean(), inplace=True)
对于类别型特征,通常使用众数填充,或者根据业务逻辑进行特殊处理。如泰坦尼克号数据中 Embarked 列使用众数填充。
如果某列缺失值比例过高,可能会影响模型效果,可以考虑删除该列。例如泰坦尼克号数据中 Cabin 列缺失值较多,可选择删除。
# 填充Age的缺失值为均值
train['Age'].fillna(train['Age'].mean(), inplace=True)
# 填充Embarked的缺失值为众数
train['Embarked'].fillna(train['Embarked'].mode()[0], inplace=True)
(二)特征编码
类别型特征编码
将类别型特征转换为数值型,以便模型能够处理。
常见的编码方法有独热编码(One - Hot Encoding)、标签编码(Label Encoding)等。独热编码适用于类别之间没有大小关系的情况,如性别、登船港口等;标签编码适用于类别有一定顺序关系的情况,但要注意避免引入不合理的顺序关系。
以泰坦尼克号 Sex 和 Embarked 列进行独热编码为例:
# 对Sex和Embarked进行独热编码
train = pd.get_dummies(train, columns=['Sex', 'Embarked'])
自定义特征编码(如有需要)
根据业务知识或数据特点,可能需要对某些特征进行特殊编码。例如,将泰坦尼克号的 Ticket 列根据某种规则转换为新的特征。
(三)特征缩放(归一化或标准化)
为什么要进行特征缩放呢?
在训练机器学习模型时,尤其是使用梯度下降法时,如果特征值范围差异很大,会导致某些特征的梯度远大于其他特征,使得模型在训练过程中收敛速度变慢,甚至在某些极端情况下导致模型无法收敛到最优解。
对于依赖距离计算的算法(如K-近邻、支持向量机),特征缩放能够确保每个特征对距离计算的影响是均衡的,从而提高模型性能。
在某些情况下,特征值范围过大或过小可能会导致数值计算问题,如溢出或下溢,从而影响模型的训练和预测。
一般来说有以下几种较为常见的特征缩放方法:
选择缩放方法
归一化(如 Min - Max 归一化)将数据映射到特定区间(如 [0, 1])。
标准化(如 Z - Score 标准化)使数据具有特定的均值和标准差(如均值为 0,标准差为 1)。
根据数据特点和模型要求选择合适的方法。一般来说,对于基于距离的算法(如 KNN),归一化或标准化可能会提高模型性能;对于树模型(如决策树、随机森林),通常不需要进行缩放,但在某些情况下进行缩放也可能有一定帮助。
以泰坦尼克号 Age 和 Fare 列进行 Min - Max 归一化为例:
from sklearn.preprocessing import MinMaxScaler
# 选择要归一化的列
cols_to_normalize = ['Age', 'Fare']
scaler = MinMaxScaler()
train[cols_to_normalize] = scaler.fit_transform(train[cols_to_normalize])
应用缩放方法
对训练集数据进行拟合(计算缩放所需的参数,如最小值、最大值或均值、标准差等),然后对训练集和测试集数据应用缩放转换,确保测试集数据的转换方式与训练集一致。
继续上面的归一化代码,对测试集进行相同的归一化处理:
# 对测试集进行归一化(使用训练集拟合的scaler)
test[cols_to_normalize] = scaler.transform(test[cols_to_normalize])
(四)特征选择与构建
相关性分析(适用于有标签数据)
计算特征与目标变量之间的相关性,选择相关性较高的特征,删除相关性较低或冗余的特征。可以使用相关系数矩阵、互信息等方法进行分析。对于泰坦尼克号数据,通过计算相关系数选择与 Survived 相关性强的特征。
也许你可以通过计算相关系数,再绘制一张热力图看看情况:
import seaborn as sns
# 计算相关系数
corr = train.corr()
# 绘制热力图
sns.heatmap(corr, annot=True, cmap='coolwarm')
plt.show()
特征重要性评估(适用于部分模型)
对于一些模型(如决策树、随机森林等),可以在训练后获取特征的重要性得分,根据重要性得分选择重要特征。例如,在随机森林模型训练后查看特征重要性。
假设已经训练了随机森林模型 rf_model:
# 查看随机森林模型的特征重要性
importances = rf_model.feature_importances_
# 将特征重要性与特征名组合
feature_importance = pd.DataFrame({'Feature': X_train.columns, 'Importance': importances})
# 按重要性排序
feature_importance.sort_values(by='Importance', ascending=False, inplace=True)
print(feature_importance)
三、模型选择与训练
(一)模型选择
根据问题类型选择模型类别
可供选择的模型有很多,之前提到过关于机器学习的模型大致可以分为两类问题,即分类和回归问题。
分类问题可选择逻辑回归、决策树、随机森林、支持向量机(SVM)、神经网络等模型。
回归问题可选择线性回归、岭回归、Lasso 回归、决策树回归、随机森林回归、神经网络回归等模型。
根据问题的特点、数据规模、计算资源等因素初步选择合适的模型类别。例如,对于泰坦尼克号生存预测这种分类问题,逻辑回归是一个简单有效的选择;对于复杂的图像分类问题,神经网络可能更合适。
模型评估与比较
如果对多个模型类别都感兴趣,可以在小数据集上进行简单的训练和评估,比较不同模型的性能(如准确率、均方误差等),选择性能较好的模型类别进一步优化。可以使用交叉验证等方法进行评估,以减少数据划分对评估结果的影响。
(二)模型训练
划分训练集和测试集(或验证集)
将数据集划分为训练集和测试集(或训练集、验证集和测试集)。
训练集用于模型训练,验证集(如果有)用于模型调参和选择,测试集用于最终模型性能评估。
常见的划分比例有 70% - 80% 作为训练集,20% - 30% 作为测试集;如果使用验证集,可将数据集按 60% 训练集、20% 验证集、20% 测试集划分。划分时要注意保持数据分布的一致性,避免数据泄露。
以泰坦尼克号数据为例,划分训练集和测试集。
from sklearn.model_selection import train_test_split
# 选择特征列和目标列
X = train.drop('Survived', axis=1)
y = train['Survived']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
训练模型
使用训练集数据对选定的模型进行训练,根据模型的不同,训练过程可能涉及不同的参数设置和优化算法。例如,逻辑回归模型通过最小化损失函数(如对数似然损失)来学习模型参数;随机森林模型通过构建多个决策树并组合它们的预测结果。
以逻辑回归和随机森林为例训练模型:
# 训练逻辑回归模型
logreg_model.fit(X_train, y_train)
# 训练随机森林模型
rf_model.fit(X_train, y_train)
四、模型评估与验证
(一)模型评估指标选择
分类问题评估指标
常用的分类问题评估指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 - Score、ROC 曲线(AUC 值)等。
准确率是预测正确的样本数占总样本数的比例;精确率是预测为正例且实际为正例的样本数占预测为正例的样本数的比例;召回率是预测为正例且实际为正例的样本数占实际为正例的样本数的比例;F1 - Score 是精确率和召回率的调和平均值;ROC 曲线以假正率(False Positive Rate)为横坐标,真正率(True Positive Rate)为纵坐标,AUC 值是 ROC 曲线下的面积,AUC 值越大,模型性能越好。
根据问题的侧重点选择合适的评估指标。例如,在不平衡分类问题中(如欺诈检测,欺诈样本占比很小),准确率可能不能很好地反映模型性能,此时精确率、召回率或 F1 - Score 可能更合适。
计算逻辑回归模型在测试集上的准确率、精确率、召回率和 F1 - Score:
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 预测测试集结果
y_pred = logreg_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
# 计算精确率
precision = precision_score(y_test, y_pred)
print("精确率:", precision)
# 计算召回率
recall = recall_score(y_test, y_pred)
print("召回率:", recall)
# 计算F1 - Score
f1 = f1_score(y_test, y_pred)
print("F1 - Score:", f1)
回归问题评估指标
常用的回归问题评估指标有均方误差(Mean Squared Error,MSE)、均方根误差(Root Mean Squared Error,RMSE)、平均绝对误差(Mean Absolute Error,MAE)、R - Squared 等。均方误差是预测值与真实值之差的平方和的平均值;均方根误差是均方误差的平方根;平均绝对误差是预测值与真实值之差的绝对值的平均值;R - Squared 表示模型对数据的拟合程度,取值范围为 0 到 1,越接近 1 表示模型拟合效果越好。
根据问题需求选择合适的评估指标。例如,在房价预测中,RMSE 可以直观地反映预测房价与真实房价的误差大小。
from sklearn.metrics import mean_squared_error, r2_score
# 预测测试集结果
y_pred = reg_model.predict(X_test)
# 计算均方根误差
rmse = mean_squared_error(y_test, y_pred, squared=False)
print("均方根误差:", rmse)
# 计算R - Squared
r2 = r2_score(y_test, y_pred)
print("R - Squared:", r2)
(二)模型性能评估
在测试集上评估模型
使用测试集数据对训练好的模型进行评估,计算选择的评估指标值,以了解模型在未见过的数据上的性能表现。这一步骤非常关键,它能够客观地反映模型的泛化能力,即模型在新数据上的预测准确性。
以逻辑回归模型在泰坦尼克号测试集上评估为例,计算准确率:
# 预测测试集结果
y_pred = logreg_model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("准确率:", accuracy)
使用交叉验证评估模型
除了在单次划分的测试集上评估模型,还可以使用交叉验证方法。交叉验证将数据集划分为多个子集(如 K - 折交叉验证,常见的 K 值有 5 或 10),依次将每个子集作为测试集,其余子集作为训练集进行训练和评估,最后取平均评估指标值。这样可以更全面地评估模型性能,减少因数据划分不同而导致的评估结果波动,提高评估的可靠性。
以逻辑回归模型为例,使用 5 - 折交叉验证计算准确率:
from sklearn.model_selection import cross_val_score
# 计算逻辑回归模型的5 - 折交叉验证准确率
cv_scores = cross_val_score(logreg_model, X, y, cv=5)
print("5 - 折交叉验证准确率:", cv_scores.mean())
标签:训练,为例,模型,train,泰坦尼克,test,数据,评估,搭建
From: https://blog.csdn.net/2301_80323116/article/details/144638505