模型融合之Bagging,及scikit learning

小编昨天第一次参加了校园招聘会面试,应聘的是机器学习和数据挖掘,当然只学了两个月的知识是远远不能应对面试官的一顿吊打。因此,回来好好反思自己的学习方法。还是平时学习没有得到即使的反馈,以及实践练习。所以,痛定思痛,决定以博客的形式来检验自己是否有没有掌握好内容,希望大家能给予监督和反馈。

最近一直看机器学习中的Bagging(bootstrap aggregatin的缩写)的方法,Bagging是属于机器学习中模型融合的一种方法。大家都知道,决策树是一个可读性很强、分类快,同时不需要对数据进行归一化还有缩放的处理。但是决策树有个不足的地方就是非常容易过拟合,所以必须要采取一些方法进行剪枝。

而bagging方法的出现,可以完美地解决了决策树过拟合的问题,同时bagging的使用也会使分类器分类效果得到了显著的提高。bagging算法原理举个例子如下:

    1.假设有1000个样本,70%的样本作为训练集,30%的样本作为测试集。 

    2.从训练集700条里样本随机抽出500条样本,用来训练,于是生成了一条决策树。

    3.然后有放回的再从700条样本在随机抽出500条样本,用来训练,于是又生成了一条决策树

    4.同上,假设我以又放回的步骤随机抽取100次,这样我就生成了100条决策树了

    5.这100条决策树对测试集的每一个样本都进行测试,然后通过投票的方式决定测集样本的预测结果。如果一个样本被这100条决策树投票,即预测分类,被分为1的票数有80票,被分为0的有20票,显然,这个样本的预测结果为1。

    这种民主公平、集思广益的方法是不是很赞!就算在一棵决策树上发生了过拟合,也不会在整个集合里发生了过拟合,就好比你一个全力人支持川普大叔当选总统,也必定有人给他反对票,然而群众的智慧最后还是调和了个体的偏见。

来看看python的scikit learn怎么去实现它吧!我们先去scikit learn的文档看看。
scikit learn文档
首先它是模型融合的其中一种方法,所以bagging是属于sklearn.ensemble的,bagging有两种,一种是用于回归的BaggingRegressor,另一种是用于分类的BaggingClassifier,用的时候一定要用对。
先看看参数吧:
参数图
常用的参数有:

  1.base_estimator :基本的估计器,就是你要用到的算法,如果该参数没有赋值,默认为决策树。这个信息告诉我们bagging,不仅可以用在决策树上,还可以用于其他的算法模型上。

   2.n_estimators:基本估计器的个数,就是你要产生多少个子模型,用在决策树时,即表示产生多少条决策树用来融合。

    3.max_samples :从X(训练集)中选取用于训练的样本数,默认为1.0,此处有点疑问。这个1.0是抽取一条样本还是比例为1的样本树?文档说max_samples的值取int 型时为抽取样本的数目,取float型时为 max_samples的值乘以样本的总数,我想问的是:假设max_samples=0.3,是抽取30%的样本吗?那万一取1.3呢?

至于其他的参数,小编还没有好好去理解过。这里有个的小案例,由于我用网格搜索去获取最优的超参数时,程序跑了很久都没有结果。所以把数据来源的网址、以及决策树和随机森林的方式实现广告识别的代码在此处帖一帖。
[数据网址,点击下载](http://archive.ics.uci.edu/ml/machine-learning-databases/internet_ads/)
代码如下:
#决策树实现广告识别
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV


#读取数据
df = pd.read_csv("ad.data", header=None, low_memory=False)
explanatory_variable_columns = set(df.columns.values)
response_variable_column = df[len(df.columns.values)-1]

#填充缺省值,以及将标签数字化
explanatory_variable_columns.remove(len(df.columns.values)-1)
y = [1 if e == 'ad.' else 0 for e in response_variable_column]
X = df.loc[:, list(explanatory_variable_columns)]
X.replace(to_replace=' *\?', value=-1, regex=True, inplace=True)

#交叉验证
X_train, X_test, y_train, y_test = train_test_split(X, y)

#网格搜索参数设置
pipeline = Pipeline([
('clf', DecisionTreeClassifier(criterion='entropy'))])
parameters = {
'clf__max_depth': (150, 155, 160),
'clf__min_samples_split': (1, 2, 3),
'clf__min_samples_leaf': (1, 2, 3)}

#网格搜索
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, sc
oring='f1')
grid_search.fit(X_train, y_train)

#获取最优参数
print('最佳效果:%0.3f' % grid_search.best_score_)
print('最优参数:')
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
    print('\t%s: %r' % (param_name, best_parameters[param_name]))

#预测以及分类器参数报告
predictions = grid_search.predict(X_test)
print(classification_report(y_test, predictions))
#这里用随机森林实现
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
import zipfile


df = pd.read_csv("ad.data", header=None, low_memory=False)
explanatory_variable_columns = set(df.columns.values)

response_variable_column = df[len(df.columns.values)-1]
# The last column describes the targets
explanatory_variable_columns.remove(len(df.columns.values)-1)
y = [1 if e == 'ad.' else 0 for e in response_variable_column]
X = df.loc[:, list(explanatory_variable_columns)]
X.replace(to_replace=' *\?', value=-1, regex=True, inplace=True)

X_train, X_test, y_train, y_test = train_test_split(X, y)
pipeline = Pipeline([
('clf', RandomForestClassifier(criterion='entropy'))
])
parameters = {
'clf__n_estimators': (5, 10, 20, 50),
'clf__max_depth': (50, 150, 250),
'clf__min_samples_split': (1, 2, 3),
'clf__min_samples_leaf': (1, 2, 3)
}

grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1, sc
oring='f1')
grid_search.fit(X_train, y_train)

print('最佳效果:%0.3f' % grid_search.best_score_)
print('最优参数:')
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
    print('\t%s: %r' % (param_name, best_parameters[param_name]))
predictions = grid_search.predict(X_test)
print(classification_report(y_test, predictions))

至于那个bagging的方法就大家去实现了。同时想了个问题,如果我用了BaggingClassifier的方法来实现广告识别的话,那么网格搜索时,是不是既有随机森林的参数需要查找,又有BaggingClassifier()的参数需要查找??

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值