集成算法
xgboost(一棵树接着一棵树往里加,每加一棵都看效果)
在完成机器学习任务时,用一个模型可能效果并不好,这样就可以用集成的思想,用多个分类器去解决同一个问题
目标函数:预测值与真实值平方项的差异(越小越好)
可以不断加树,但要保证每加入一棵树,效果很比以前好
我们每一轮选取的一个f来使我们的目标函数尽量最大地降低
Xgboost实战演示(Xgboost做分类任务)
In[1]: import xgboost
In[2]: from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 用,做分隔符
X = dataset[:, 0:8]
# 数据集
Y = dataset[:, 8]
# 标签
seed = 7
test_size = 0.33
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=test_size, random_state=seed)
model = XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
prediction = [round(value) for value in y_pred]
# 对每个数向下取整
accuracy = accuracy_score(y_test, prediction)
# 看准确率的函数
print('Accuracy:%.2f%%' % (accuracy * 100.0))
# 保留两位小数
In[3]: # 加入监控,看一下每加入一棵树后结果有何不同,只改变两处代码,在model = XG....()和y_pred = mod...之间
eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric='logloss', eval_set=eval_set, verbose=True)
# early_stopping_rounds是指若模型在n次改变后准确率都没有再改善,则会自动停止,这是我们认为模型已经饱和了,eval_metric是用怎样的loss来评估模型,eval_set是指定测试集,每进行一次就测试一次
In[4]: from numpy import loadtxt
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot
dataset = loadtxt('pima-indians-diabetes', delimiter=',')
X = dataset[:, 0:8]
y = dataset[:, 8]
model = XGBClassifier()
model.fit(X, y)
plot_importance(model)
# 得出每个特征的重要性
pyplot.show()
Xgboost参数
xgb1 = XGBClassifier(learning_rate=0.1, n_estimators=1000, max_depth=5, min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8, objective=‘binary:logistic’, nthread=4, scale_pos_weight=1, seed=27)
learning_rate:学习率,一般在0.1以下 n_estimators:树的个数 max_depth:树的深度 min_child_weight:叶子节点的最小权重系数 gamma:损失系数 subsample:选择一定比例的样本建树,不选的话就是0.1 colsample_bytree:特征的选取比例 objective:指定损失函数的类型
In[5]: 用GridSearchCV选择参数
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold
dataset = loadtxt('pima-indians-diabetes', delimiter=',')
X = dataset[:, 0:8]
y = dataset[:, 8]
model = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
# 指定学习率区域
param_grid = dict(learning_rate=learning_rate)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)
# 交叉验证
grid_search = GridSearchCV(model, param_grid, scoring='neg_log_loss', n_jobs=-1, cv=kfold)
# 指定用的损失函数,n_jobs=-1就是用所有空闲的cpu来跑
grid_result = grid_search.fit(X, y)
print('Best:%f using %s' % (grid_result.best_score_, grid_result.best_params_))
# 最好的结果与最好的参数
means = grid_result.cv_results_['mean_test_score']
params = grid_result.cv_results_['params']
for mean,param in zip(means, params):
print('%f with:%r' % (mean, param))
# 输出每个学习率所得到的分数
Adaboost
Adaboost,是英文’Adaptive Boosting’(自适应增强)的缩写。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误了或达到预先指定的最大迭代次数。
1.初始化训练集权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权重:1 / N
2.训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权重就被降低;相反,如果某个样本点没有被准确的分类,那么它的权重就得到提高。然后,权重更新过的样本集被用于训练下一个弱分类器,整个训练过程如此迭代地进行下去。
3.将各个训练得到的弱分类器组成强分类器。各个弱分类器的训练过程结束后,加大分类误差小的弱分类器的权重,使其在最终的分类函数中起着较大的作用。相反,降低分类误差大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。
过程:输入数据;根据结果调成数据的权重再给下一个模型;根据每个分类器的正确率给与分类器一个权重值;根据所有分类器的权重值将它们结合在一起,共同得出结果。
上一篇: 机器学习4集成算法与随机森林
下一篇: 图像预处理简要