机器学习模型代码详细解释

#特征工程
features = data.drop('target', axis=1)
labels = data['target']
train_features, test_features, train_labels, test_labels  = train_test_split(features, labels, test_size=0.3, random_state=1)
  1. 通过 data.drop('target', axis=1),从数据中分离出特征。它会移除名为 'target' 的列,保留其他所有列作为特征。
  2. 通过 data['target'],获取数据中的目标变量(标签),并将其存储在变量 labels 中。
  3. 使用 train_test_split 函数将特征和标签分割成训练集和测试集。其中参数 test_size=0.3 表示测试集占总数据的30%,random_state=1 用于设置随机种子,以确保每次运行代码时分割的结果都是相同的。分割后的训练集特征、测试集特征、训练集标签和测试集标签分别存储在 train_featurestest_featurestrain_labels 和 test_labels 变量中

针对不平衡数据集的处理

smo_ratio = 5
mino_num = train_labels.value_counts()[0]
majo_num = train_labels.value_counts()[1]
imbalanced_ratio = float(mino_num) / float(majo_num)
if imbalanced_ratio > smo_ratio:
    smo = SMOTE(sampling_strategy={1:int(float(mino_num)/float(smo_ratio))})
    train_features, train_labels = smo.fit_resample(train_features, train_labels)
    print('num of label 1 after smote:%d' % sum(train_labels))
    print('num of label 0 after smote:%d' % (len(train_labels) - sum(train_labels)))
  1. 首先计算了训练集中标签为 0 和标签为 1 的样本数量,分别存储在 mino_num 和 majo_num 中。
  2. 计算了不平衡比率,即标签为 0 的样本数量除以标签为 1 的样本数量,存储在 imbalanced_ratio 中。
  3. 如果不平衡比率大于预先设定的阈值 smo_ratio,则执行下面的操作:
    • 使用 SMOTE 方法对少数类样本(标签为 1)进行过采样,使得少数类样本数量达到多数类样本数量除以 smo_ratio。这里使用了 sampling_strategy 参数来设置过采样的比例。
    • 使用 fit_resample 方法将过采样后的特征和标签重新组合成训练集。
    • 打印出经过 SMOTE 处理后的标签为 1 和标签为 0 的样本数量。

据进行转换和规范化

#数据转换
dvec = DictVectorizer(sparse=False)
train_features = dvec.fit_transform(train_features.to_dict(orient='record'))
test_features = dvec.transform(test_features.to_dict(orient='record'))
#进行规范化
ss = StandardScaler()
train_features = ss.fit_transform(train_features)
test_features = ss.transform(test_features)
  1. DictVectorizer:这是一个用于将字典类型的特征转换成稀疏矩阵或密集矩阵的工具。在这里,首先创建了一个 DictVectorizer 对象 dvec,然后使用 fit_transform() 方法将训练特征 train_features 转换为字典形式并进行转换操作,最终得到稀疏或密集矩阵。测试特征 test_features 也会被相同的转换方式处理,但是这里使用了 transform() 方法,因为测试数据应该使用与训练数据相同的转换规则。

  2. StandardScaler:这是一个用于特征缩放的工具,它通过移除平均值和缩放到单位方差来标准化特征。在这里,首先创建了一个 StandardScaler 对象 ss,然后使用 fit_transform() 方法对训练特征 train_features 进行规范化处理,使得其均值为0,方差为1。接着,对测试特征 test_features 使用 transform() 方法,使用相同的规范化方式,确保测试数据与训练数据相互兼容。

随机森林分类器模型训练和预测,网格搜索调整模型的超参数

rf = RandomForestClassifier()
param_grid = {'n_estimators': range(8, 10)}
clf = GridSearchCV(rf, param_grid=param_grid, cv=5)
clf.fit(train_features, train_labels)
prediction = clf.predict(test_features)
  1. rf = RandomForestClassifier():创建了一个随机森林分类器对象 rf。随机森林是一种集成学习方法,它由多个决策树组成,通过投票或取平均值的方式来提高预测准确度。

  2. param_grid = {'n_estimators': range(8, 10)}:定义了一个参数网格,其中包含了待调整的超参数 'n_estimators''n_estimators' 表示随机森林中树的数量。在这个网格中,'n_estimators' 的取值范围是从 8 到 9(不包括 10)。

  3. clf = GridSearchCV(rf, param_grid=param_grid, cv=5):创建了一个网格搜索对象 clf,用于在给定的参数网格上执行交叉验证网格搜索。rf 是要使用的分类器,param_grid 是要搜索的参数网格,cv=5 指定了进行 5 折交叉验证。

  4. clf.fit(train_features, train_labels):在训练集 train_features 上拟合(训练)了网格搜索对象 clf。这会对指定的参数网格中的每一种参数组合进行训练,并使用交叉验证来评估每个参数组合的性能。

  5. prediction = clf.predict(test_features):对测试集 test_features 进行预测,使用训练好的模型 clf 进行预测,并将预测结果保存在 prediction 中。

 预测 & 结果导出

#预测 & 结果导出
from collections import Counter
#设置阈值
threshold = 0.15
#模型应用
apply_prediction = clf.predict_proba(apply_features)[:, 1]
apply_pred_new = (apply_prediction >= threshold).astype(int)
apply_data['predictions']= apply_pred_new
  1. apply_prediction = clf.predict_proba(apply_features)[:, 1]:使用训练好的模型 clf 对标准化后的特征数据 apply_features 进行预测,得到的是每个样本属于各个类别的概率,这里取的是正例的概率(类别为 1 的概率)。

  2. apply_pred_new = (apply_prediction >= threshold).astype(int):根据设定的阈值 threshold 对预测的概率进行二分类,将大于等于阈值的预测概率设为 1,小于阈值的设为 0,并将结果转换为整数类型。这里使用了阈值来确定正负样本的分类。

评估指标准确率、召回率、精确率和 F1 分数

#模型评估
y_pred_proba = clf.predict_proba(test_features)[:, 1]
y_pred_new = (y_pred_proba >= threshold).astype(int)
accuracy_new = accuracy_score(test_labels, y_pred_new)
recall_new = recall_score(test_labels, y_pred_new)
precision_new = precision_score(test_labels, y_pred_new)
f1_new = f1_score(test_labels, y_pred_new)
cm = confusion_matrix(test_labels, y_pred_new)
tp = cm[1, 1]
fn = cm[1, 0]
fp = cm[0, 1]
tn = cm[0, 0]
  1. y_pred_proba = clf.predict_proba(test_features)[:, 1]:使用训练好的模型 clf 对测试集的特征数据 test_features 进行预测,得到的是每个样本属于各个类别的概率,这里取的是正例的概率(类别为 1 的概率)。

  2. y_pred_new = (y_pred_proba >= threshold).astype(int):根据设定的阈值 threshold 对预测的概率进行二分类,将大于等于阈值的预测概率设为 1,小于阈值的设为 0,并将结果转换为整数类型。这里使用了阈值来确定正负样本的分类。

  3. accuracy_new = accuracy_score(test_labels, y_pred_new):计算模型在测试集上的准确率,即模型预测正确的样本数占总样本数的比例。

  4. recall_new = recall_score(test_labels, y_pred_new):计算模型在测试集上的召回率,即真正例占所有实际正例的比例。

  5. precision_new = precision_score(test_labels, y_pred_new):计算模型在测试集上的精确率,即真正例占所有预测为正例的样本的比例。

  6. f1_new = f1_score(test_labels, y_pred_new):计算模型在测试集上的 F1 分数,综合考虑了精确率和召回率的平衡值。

  7. cm = confusion_matrix(test_labels, y_pred_new):计算模型在测试集上的混淆矩阵,包括真正例(TP)、假负例(FN)、假正例(FP)和真负例(TN)的数量。

  8. tp = cm[1, 1]fn = cm[1, 0]fp = cm[0, 1]tn = cm[0, 0]:分别提取混淆矩阵中的各个元素,用于后续分析和展示。

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值