一、原理分析
首先按照西瓜书以及学习资料对集成学习以及投票法有了一个大概的了解。
投票法是一种遵循少数服从多数原则的集成学习模型,通过多个模型的集成降低方差,从而提高模型的鲁棒性。在理想情况下,投票法的预测效果应当优于任何一个基模型的预测效果。投票法属于数据挖掘模型融合的部分,之前看了心跳信号的分类预测,但是基础并不好,后面希望能在每一个步骤部分进一步学习。
投票法如何用于分类或回归?
如果是分类,投票法把超过半数以上的投票结果作为要预测的分类,投票法处理回归问题,是将各个基分类器的回归结果简单求平均。
二、案例分析
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from matplotlib import pyplot
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import BaggingClassifier
from numpy import mean
创建一个1000个样本,20个特征的随机数据集:
sklearn.datasets.make_classification()
功能:功能:生成样本集,通常用于分类算法
返回值:
X:形状数组[n_samples,n_features]
生成的样本。
y:形状数组[n_samples]
标签,标示样本属于那个聚簇,用整数表示
参数 | 注释 |
---|---|
n_features=20 | 特征个数= n_informative() + n_redundant + n_repeated |
n_informative=2 | 多信息特征的个数 |
n_redundant=2 | 冗余信息,informative特征的随机线性组合 |
n_repeated=0 | 重复信息,随机提取n_informative和n_redundant 特征 |
n_classes=2 | 分类类别 |
n_clusters_per_class=2 | 某一个类别是由几个cluster构成的 |
weights=None | 列表类型,权重比 |
random_state=None | 如果是int,random_state是随机数发生器使用的种子; 如果RandomState实例,random_state是随 机数生成器; 如果没有,则随机数生成器是np.random使用的RandomState实例 |
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=2)
# summarize the dataset
return X,y
如果使用鸢尾花数据集
from sklearn.datasets import load_iris
def get_dataset():
iris=load_iris()
X=iris.data
y=iris.target
# summarize the dataset
return X,y
使用多个KNN模型作为基模型演示投票法,其中每个模型采用不同的邻居值K参数
sklearn.neighbors.KNeighborsClassifier()
功能:用于实现k近邻投票算法的分类器。
参数 | 注释 |
---|---|
n_neighbors | 默认情况下kneighbors查询使用的邻居数。就是k-NN的k的值,选取最近的k个点 |
weights | (默认=‘uniform’)均等权重;distance:不均等的权重,距离近的点比距离远的点的影响大:用户自定义函数,接收距离的数组,返回一组维数相同的权重。 |
algorithm | {‘auto’(自己决定合适的搜索算法,‘ball_tree’(克服kd树高纬失效,每个节点是一个超球体),‘kd_tree’(二叉树),‘brute’(蛮力搜索)} |
leaf_size | int,optional(默认值= 30) 是构造的kd树和ball树的大小。会影响树构建的速度和搜索速度,以及存储树所需的内存大小 |
p | (默认= 2):使用欧式距离公式进行距离度量。1:使用曼哈顿距离公式进行距离度量 |
列表(list)、元祖(tuple)、集合(set),和字典(dictionary)区别和联系
# get a voting ensemble of models
def get_voting():
# define the base models
models = list()
models.append(('knn1', KNeighborsClassifier(n_neighbors=1)))
models.append(('knn3', KNeighborsClassifier(n_neighbors=3)))
models.append(('knn5', KNeighborsClassifier(n_neighbors=5)))
models.append(('knn7', KNeighborsClassifier(n_neighbors=7)))
models.append(('knn9', KNeighborsClassifier(n_neighbors=9)))
# define the voting ensemble
ensemble = VotingClassifier(estimators=models, voting='hard')
return ensemble
创建一个模型列表来评估投票带来的提升,包括KNN模型配置的每个独立版本和硬投票模型。下面的get_models()函数可以为我们创建模型列表进行评估。
# get a list of models to evaluate
def get_models():
models = dict()
models['knn1'] = KNeighborsClassifier(n_neighbors=1)
models['knn3'] = KNeighborsClassifier(n_neighbors=3)
models['knn5'] = KNeighborsClassifier(n_neighbors=5)
models['knn7'] = KNeighborsClassifier(n_neighbors=7)
models['knn9'] = KNeighborsClassifier(n_neighbors=9)
models['hard_voting'] = get_voting()
return models
下面的evaluate_model()函数接收一个模型实例,并以分层10倍交叉验证三次重复的分数列表的形式返回。
cross_val_score()
功能:用来进行交叉验证
参数 | 注释 |
---|---|
estimator | 估计方法对象(分类器) |
X | 数据特征(Features) |
y | 数据标签(Labels) |
soring | 调用方法(包括accuracy和mean_squared_error等等) |
cv | 折交叉验证 |
n_jobs | 同时工作的cpu个数(-1代表全部) |
# evaluate a give model using cross-validation
from sklearn.model_selection import cross_val_score #Added by ljq
def evaluate_model(model, X, y):
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
return scores
报告每个算法的平均性能,还可以创建一个箱形图和须状图来比较每个算法的精度分数分布。
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
scores = evaluate_model(model, X, y)
results.append(scores)
names.append(name)
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()
博客推荐:
https://blog.csdn.net/pythonstartl/article/details/83010928
https://blog.csdn.net/wuzhongqiang/article/details/105012739