淘先锋技术网

首页 1 2 3 4 5 6 7

利用sklearn自己构建一组含有1000个样本点,6个特征,3个类别的分类数据集(随机种子取666),并利用(传统的分类模型:决策树、朴素贝叶斯、K近邻、BP神经网络、逻辑回归、支持向量机等,以及集成学习模型:Voting、Bagging、随机森林、AdaBoost、GBDT)对数据进行训练,充分利用交叉验证及网格搜索调优,尽可能地提高模型的分类效果。模型分类效果请通过混淆矩阵、ROC曲线、学习曲线、验证曲线等方式进行展示。

一、创建分类数据集

利用sklearn自己构建一组含有1000个样本点,6个特征,3个类别的分类数据集(随机种子取666)

from sklearn.datasets import make_classification

# 创建分类数据集
X,y = make_classification(n_samples=1000, n_features=6, n_classes=3, n_clusters_per_class=1,random_state=666)

查看生成的数据集

import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.spring,edgecolors='k')

在这里插入图片描述

二、Bagging

bagging:bootstrap aggregating 的缩写。
是一种并行式集成学习方法,可用于二分类,多分类,回归等任务。

基本流程:

对一个包含 m 个样本的数据集,有放回地进行 m 次随机采样,这样得到具有 m 个样本的采样集。
取 T 个这样的采样集。
每个采样集训练一个基学习器。
结合:分类任务,使用简单投票法。回归任务,使用简单平均法。

接下来导入bagging分类器,并进行模型训练

from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier

clf1 = DecisionTreeClassifier(criterion='entropy', max_depth=1)
clf2 = KNeighborsClassifier(n_neighbors=1)    

from sklearn.ensemble import BaggingClassifier
bagging1 = BaggingClassifier(base_estimator=clf1, n_estimators=10, max_samples=0.8, max_features=0.8)
bagging2 = BaggingClassifier(base_estimator=clf2, n_estimators=10, max_samples=0.8, max_features=0.8)

分类结果可视化

%matplotlib inline
import itertools
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from mlxtend.plotting import plot_learning_curves
from mlxtend.plotting import plot_decision_regions

from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
X_2 = pca.fit_transform(X)

label = ['Decision Tree', 'K-NN', 'Bagging Tree', 'Bagging K-NN']
clf_list = [clf1, clf2, bagging1, bagging2]

fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(2, 2)
grid = itertools.product([0,1],repeat=2)

for clf, label, grd in zip(clf_list, label, grid):        
    scores = cross_val_score(clf,X_2,y, cv=3, scoring='explained_variance')
    print(scores.mean(), scores.std(), label)
        
    clf.fit(X_2, y)
    ax = plt.subplot(gs[grd[0], grd[1]])
    fig = plot_decision_regions(X=X_2, y=y, clf=clf, legend=2)
    plt.title(label)

plt.show()

0.5568470669434885 0.030795326878072328 Decision Tree
0.8846731801731996 0.011130474352660723 K-NN
0.7827354547944942 0.03630358941377073 Bagging Tree
0.13255203937396962 0.3498788397192328 Bagging K-NN
在这里插入图片描述
若出现中文字符、正负号等模糊不清的情况,可加上如下代码解决:

plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False

三、Voting

构建若干基础模型

from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier   
from sklearn.neural_network import MLPClassifier

clf1 = LogisticRegression()
clf2 = GaussianNB()
clf3 = SVC(kernel='rbf', probability=True)
clf4 = KNeighborsClassifier() 
clf5 = MLPClassifier(hidden_layer_sizes=(100,100,100),solver = 'sgd')

接下来建立投票分类器(soft),利用网格搜索库设定参数搜索范围,并在网格搜索中直接调用投票分类器

# 导入网格搜索库
from sklearn.model_selection import GridSearchCV
# 导入投票分类器
from sklearn.ensemble import VotingClassifier

# 建立投票分类器(soft)      (实例化)
vot_clf = VotingClassifier(estimators=[("lr",clf1),("GNB",clf2),("SVM",clf3)],voting='soft')
# 设定参数搜索范围
params = {"lr__C":[0.1,1,10],
         "SVM__C":[0.01,0.1,1,10],
         "SVM__kernel":["linear", "rbf"]}

# 在网格搜索中直接调用投票分类器
grid = GridSearchCV(estimator=vot_clf,param_grid=params,cv=8)
grid = grid.fit(X,y)

可利用grid.score(X,y)查看得分
在这里插入图片描述

查看网格搜索结果
在这里插入图片描述
绘制混淆矩阵评估模型效果

from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt

# 输出混淆矩阵的值。labels指定预测的标签,前面的为正例,后面的为负例。
matrix = confusion_matrix(y_true=y, y_pred=predict, labels=[1, 0])
# 混淆矩阵图。
plt.matshow(matrix, cmap = plt.get_cmap('YlOrRd'), alpha=0.5)
# 依次遍历矩阵的行与列。
for i in range(matrix.shape[0]):
    for j in range(matrix.shape[1]):
        # va:指定垂直对齐方式。
        # ha:指定水平对齐方式。
        plt.text(x=j, y=i, s=matrix[i, j], va='center', ha='center')
plt.rcParams.update({"font.size":20})
plt.xlabel('预测值')
plt.ylabel('实际值')
plt.show()

在这里插入图片描述

四、随机森林

from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators=300,oob_score=True)
rfc.fit(X,y)

rfc.feature_importances_可用来查看随机森林模型计算的特征重要性
rfc.predict_proba(X)可查看随机森林模型的袋外OOB测试结果
特征重要性可视化:

y_importances = rfc.feature_importances_
x_importances = ['特征一','特征二','特征三','特征四','特征五','特征六']
y_pos = np.arange(len(x_importances))

# 横向柱状图
plt.barh(y_pos, y_importances, align='center',edgecolor='r',alpha=0.6,facecolor='tan')
plt.yticks(y_pos, x_importances)
plt.xlabel('Importances')
plt.xlim(0,1)
plt.rcParams.update({"font.size":10})
plt.title('Features Importances')
plt.show()

在这里插入图片描述
绘制学习曲线评估模型效果

from sklearn.model_selection import learning_curve
size = np.linspace(0.1,1,100)
train_sizes, train_scores, test_scores = learning_curve(RandomForestClassifier(),
                                                        X, y,
                                                       train_sizes=size)
plt.scatter(train_sizes,np.mean(train_scores,axis = 1))
plt.scatter(train_sizes,np.mean(test_scores,axis = 1))

在这里插入图片描述