【集成学习】基于python的Stacking分类预测

目录

 

1 Stacking分类模型的建立

1.1 基础层分类器

1.2 Stacking集成分类模型建立

2 代码

2.1加载数据集

2.2 数据预处理

2.3 划分数据集

2.4 Stacking分类模型构建

 2.5 Stacking分类模型训练

2.6 Stacking分类模型预测

2.7 预测结果可视化

2.7.1 混淆矩阵

2.7.2 ROC曲线

2.7.3 P-R曲线

1 Stacking分类模型的建立

1.1 基础层分类器

  1. 逻辑回归(Logistic Regression):逻辑回归是一种广义线性模型,用于解决二分类问题。它通过应用一个逻辑函数(通常是Sigmoid函数)将线性回归模型的输出压缩到0和1之间,从而表示概率。
  2. 决策树(Decision Tree):决策树是一种树形结构,其中每个内部节点表示一个特征上的测试,每个分支代表一个测试输出,每个叶节点包含一个类别标签。决策树通过递归地将数据集划分为子集来工作,使得每个子集尽可能“纯”(即属于同一类别)。
  3. 支持向量机(SVM):支持向量机是一种监督学习模型,用于数据分类问题。它试图找到一个超平面(在二维空间中为一条直线,三维空间中为一个平面,高维空间中为超平面),该超平面能够将数据划分为两个类别,同时最大化两个类别之间的边界(即间隔)。
  4. K近邻(KNN):K近邻算法是一种基于实例的学习,或者说是局部逼近和将所有计算推迟到分类之后进行的惰性学习。在分类时,它根据样本在特征空间中的k个最近邻的类别来投票决定该样本的类别。
  5. 随机森林(Random Forest):随机森林是决策树的集成,通过构建多个决策树并让它们对样本进行投票来工作。每个决策树都基于原始数据集的随机样本和随机特征子集来构建。通过集成多个决策树的预测,随机森林可以减少过拟合,并提高预测的准确性。
  6. AdaBoost(Adaptive Boosting):AdaBoost是一种迭代算法,用于训练不同的分类器(弱分类器),并将它们组合成一个强分类器。它通过调整每个样本的权重,使得先前分类器错误分类的样本在后续分类器中获得更高的权重。
  7. XGBoost:XGBoost(Extreme Gradient Boosting)是一种优化的梯度提升算法,它使用树模型作为弱学习器,并通过并行计算和其他优化策略来提高训练速度和模型性能。
  8. LightGBM:LightGBM(Light Gradient Boosting Machine)是一个梯度提升框架,它使用基于树的学习算法。它通过基于梯度的单边采样(Gradient-based One-Side Sampling, GOSS)和排他特征捆绑(Exclusive Feature Bundling, EFB)等策略来减少数据大小和特征数量,从而加快训练速度并减少内存使用。

1.2 Stacking集成分类模型建立

  1. 训练基础层分类器:首先,使用训练数据 和标签 来训练基础层分类器列表中的每个分类器。

  2. 生成元特征:使用训练好的基础层分类器对训练数据 进行预测,生成新的特征(称为元特征或二级特征)。这些预测作为堆叠模型下一层(元分类器)的输入。

  3. 训练元分类器:使用生成的元特征和原始训练数据的标签  来训练堆叠模型的元分类器(本文为 另一个逻辑回归模型)。

  4. 预测:在测试阶段,首先使用基础层分类器对测试数据 进行预测,生成元特征。然后,将这些元特征输入到元分类器中进行最终预测。

        通过这个过程,堆叠集成学习模型能够结合多个基础分类器的优点,并通过元分类器进一步提升整体模型的性能。

2 代码

2.1加载数据集

import numpy as np
import pandas as pd
df = pd.read_csv('TUANDROMD.csv')  
  
# 将“质量等级”一列转换为数字  
mapping = {'malware': 0, 'goodware': 1}  
df['Label'] = df['Label'].map(mapping).fillna(0) 

        数据集预览如图2-1、图2-2所示:

ff22c08fafd747c3a161680d2b5d1380.png

图2-1 部分数据集

89683b7ccc0f44ebaeef8b80c49b78c9.png

图2-2 数据集续

2.2 数据预处理

print(df.isnull().sum())  # 检测缺失值   
# 可视化缺失值 
import missingno as msno  
msno.matrix(df)   
# 删除包含缺失值的行 
df = df.dropna()   
# 检测重复值  
print(df.duplicated().sum())   
# 删除重复的行(如果有的话)  
df = df.drop_duplicates()

        缺失值与重复值情况如图2-3所示:

044f69cef5144236b5198e35357bfc1b.png

图2-3 缺失值与重复值情况

        缺失值可视化如图2-4所示:

ce74ae59e5e54c86af2ed279bc4e3c84.png

图2-4 缺失值可视化

2.3 划分数据集

from sklearn.model_selection import train_test_split
X = df.drop('Label', axis=1) 
y = df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) 

2.4 Stacking分类模型构建


from sklearn.linear_model import LogisticRegression  
from sklearn.tree import DecisionTreeClassifier  
from sklearn.svm import SVC  
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier  
from xgboost import XGBClassifier  
from lightgbm import LGBMClassifier  
from sklearn.ensemble import StackingClassifier  
from sklearn.metrics import confusion_matrix  
import seaborn as sns  
import matplotlib.pyplot as plt  
  
# 定义基础层分类器列表  
base_learners = [  
    ('Logistic Regression', LogisticRegression()),  
    ('Decision Tree', DecisionTreeClassifier()),  
    ('SVM', SVC(probability=True)),  
    ('KNN', KNeighborsClassifier(3)),  
    ('Random Forest', RandomForestClassifier()),  
    ('AdaBoost', AdaBoostClassifier()),  
    ('XGBoost', XGBClassifier()),  
    ('LightGBM', LGBMClassifier())  
]  
  
# 使用StackingClassifier构建stacking集成学习模型  
stacking_clf = StackingClassifier(  
    estimators=base_learners,  
    final_estimator=LogisticRegression()  
)  

 2.5 Stacking分类模型训练

# 训练stacking集成学习模型  
stacking_clf.fit(X_train, y_train) 

2.6 Stacking分类模型预测

# 预测  
y_pred_stacking = stacking_clf.predict(X_test) 

2.7 预测结果可视化

2.7.1 混淆矩阵

plt.figure(figsize=(6,6))   
# 假设 num_classes 是类别的数量  
num_classes = len(np.unique(y_train))  
  
# 确保我们可以将分类器数量和一个额外的堆叠模型的混淆矩阵放入布局中  
# 这里我们假设最大可以显示9个基础分类器的混淆矩阵,以及一个堆叠模型的混淆矩阵  
max_classifiers_to_show = 9  
  
# 创建一个3x4的布局来容纳所有子图(9个基础分类器 + 1个堆叠模型)  
fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(18, 12))  # 调整figsize以适应你的需要  
axes = axes.flatten()[:max_classifiers_to_show]  # 只使用前max_classifiers_to_show个子图  
  
# 创建一个颜色映射列表  
#cmaps = sns.color_palette("husl", max_classifiers_to_show)  # 使用seaborn的颜色映射  
cmaps = ['Blues', 'Greens', 'Reds', 'Purples', 'Oranges', 'YlOrBr', 'YlOrRd', 'BuGn', 'BuPu']  
# 遍历分类器  
for ax_idx, (name, clf) in enumerate(base_learners[:max_classifiers_to_show]):  
    # 拟合模型  
    clf.fit(X_train, y_train)  
    # 预测测试集  
    y_pred = clf.predict(X_test)  
    # 计算混淆矩阵  
    cm = confusion_matrix(y_test, y_pred)  
    sns.heatmap(cm, annot=True, fmt='d', cmap=cmaps[ax_idx], ax=axes[ax_idx])  
    axes[ax_idx].set_xlabel('Predicted')  
    axes[ax_idx].set_ylabel('True')  
    axes[ax_idx].set_title(f'Confusion Matrix for {name}')  
  
# 添加堆叠集成学习模型的混淆矩阵  
stacking_cm = confusion_matrix(y_test, y_pred_stacking)  
sns.heatmap(stacking_cm, annot=True, fmt='d', cmap=cmaps[-1], ax=axes[-1])  # 使用最后一个颜色映射  
axes[-1].set_xlabel('Predicted')  
axes[-1].set_ylabel('True')  
axes[-1].set_title('Confusion Matrix for Stacking')  
  
# 显示图形  
plt.tight_layout()  # 确保子图之间不重叠  
plt.show()

        八个基础分类器与Stacking集成分类模型的混淆矩阵如图2-5所示:

99abcb4e1ca34ef191cd716a78e1fd6a.png

图2-5 混淆矩阵对比图

2.7.2 ROC曲线

# ROC 曲线绘图  
plt.figure(figsize=(6,6))  
for name, clf in base_learners:    
    clf.fit(X_train, y_train)  
    y_score = clf.predict_proba(X_test)[:, 1]  
    fpr, tpr, thresholds = roc_curve(y_test, y_score)  
    roc_auc = auc(fpr, tpr)  
    plt.plot(fpr, tpr, label=f'{name} (AUC = {roc_auc:.2f})')  
  
# 绘制堆叠分类器的ROC曲线  
stacking_y_score = stacking_clf.predict_proba(X_test)[:, 1]  
stacking_fpr, stacking_tpr, _ = roc_curve(y_test, stacking_y_score)  
stacking_roc_auc = auc(stacking_fpr, stacking_tpr)  
plt.plot(stacking_fpr, stacking_tpr, label=f'Stacking (AUC = {stacking_roc_auc:.2f})', linestyle='--')  
  
plt.plot([0, 1], [0, 1], 'k--')  
plt.xlim([0.0, 1.0])  
plt.ylim([0.0, 1.05])  
plt.xlabel('False Positive Rate')  
plt.ylabel('True Positive Rate')  
plt.title('Receiver Operating Characteristic')  
plt.legend(loc="lower right")  
plt.show()  

        八个基础分类器与Stacking集成分类模型的ROC曲线如图2-6所示:

9f5a7a744472459695c54dd576c24a2e.png

图2-6 ROC曲线

        从图2-6可以看出Stacking集成分类模型准确率并非最高,可能是没有充分学习逻辑回归模型的经验。

2.7.3 P-R曲线

# P-R 曲线绘图  
plt.figure(figsize=(6, 6))  
for name, clf in base_learners:    
    clf.fit(X_train, y_train)  
    y_score = clf.predict_proba(X_test)[:, 1]  
    precision, recall, _ = precision_recall_curve(y_test, y_score)  
    average_precision = average_precision_score(y_test, y_score)  
    plt.plot(recall, precision, label=f'{name} (AP = {average_precision:.2f})')  
  
# 绘制堆叠分类器的P-R曲线  
stacking_precision, stacking_recall, _ = precision_recall_curve(y_test, stacking_y_score)  
stacking_average_precision = average_precision_score(y_test, stacking_y_score)  
plt.plot(stacking_recall, stacking_precision, label=f'Stacking (AP = {stacking_average_precision:.2f})', linestyle='--')  
  
plt.xlabel('Recall')  
plt.ylabel('Precision')  
plt.title('Precision-Recall Curve')  
plt.legend(loc="lower left")  
plt.ylim([0.0, 1.05])  
plt.xlim([0.0, 1.0])  
plt.show()

        八个基础分类器与Stacking集成分类模型的P-R曲线如图2-7所示:

9822b5df538f416dae91d89b69890971.png

图2-7

        从图2-7同样也可以看出,逻辑回归的预测作为次级模型的特征时,次级模型的预测效果较差。

        如果有兴趣可以试试不同的元分类器,看看结果。这里4465条数据能达到98%的准确率已经非常高了,就不再拓展了。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值