Python机器学习Sklearn实战Adaboost算法示例详解
Adaboost是一种提升树算法,它能将多个弱分类器组成强分类器,通常被用于二分类和多类分类问题中。本文将对Adaboost算法的原理、实现和优化进行详细的讲解,并提供两个示例说明。
Adaboost算法原理
Adaboost算法利用多个弱分类器组合出一个强分类器,主要步骤如下:
- 初始化每个训练样本的权重为1/N(N为样本数量),这些样本的权重用于表示难以分类的样本的重要度;
- 训练第一个弱分类器;
- 对于所有的样本,更新其权重,在第一个分类器中被错误分类的样本权重将会增加,正确分类的样本权重将会减少;
- 为了保证每个分类器都能取得一定的作用,使用一个新的数据集来代替原始数据集,其中每个样本被选中的概率与其权重成正比;
- 重复步骤2~4,直到训练出足够的弱分类器,或者误差已经足够小。
Adaboost算法实现
在Scikit-learn中,我们可以使用AdaBoostClassifier来实现Adaboost算法,参数如下:
- base_estimator:基分类器,可以是一个决策树;
- n_estimators:弱分类器的数量,默认为50;
- learning_rate:学习率,默认为1.0;
- algorithm:Adaboost算法的实现方法,默认为SAMME.R。
具体的使用示例如下:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成样本数据
X, y = make_classification(n_samples=1000, random_state=1)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
# 创建基分类器
tree = DecisionTreeClassifier(max_depth=1, random_state=1)
# 创建Adaboost分类器
clf = AdaBoostClassifier(base_estimator=tree, n_estimators=100, learning_rate=1.0, algorithm='SAMME.R', random_state=1)
# 训练分类器
clf.fit(X_train, y_train)
# 测试分类器
print("accuracy:", clf.score(X_test, y_test))
Adaboost算法优化
Adaboost算法的每个分类器都是在所有样本上进行训练的,这样会导致算法比较耗时。因此,我们可以对Adaboost进行优化,其主要方法有以下两点:
- 剪枝:每个基分类器的训练过程可以使用剪枝技术,来减少其复杂度和计算时间;
- 加权:使用加权输入数据训练基分类器。
具体的使用示例如下:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成样本数据
X, y = make_classification(n_samples=1000, random_state=1)
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
# 创建基分类器
tree = DecisionTreeClassifier(max_depth=1, random_state=1)
# 创建Adaboost分类器
clf = AdaBoostClassifier(base_estimator=tree, n_estimators=100, learning_rate=1.0, algorithm='SAMME.R', random_state=1)
# 计算样本的权重
weights = [1.0 / len(y_train)] * len(y_train)
for i in range(len(clf.estimators_)):
preds = clf.estimators_[i].predict(X_train)
errors = [int(preds[j] != y_train[j]) for j in range(len(y_train))]
weighted_error = sum([weights[j] * errors[j] for j in range(len(y_train))]) / sum(weights)
alpha = 0.5 * np.log((1.0 - weighted_error) / max(weighted_error, 1e-16))
for j in range(len(weights)):
weights[j] = weights[j] * np.exp(-alpha * errors[j] * preds[j])
# 加权训练基分类器
tree.fit(X_train, y_train, sample_weight=weights)
# 更改每个基分类器的样本权重
clf.estimator_weights_[0] = alpha
clf.estimator_errors_[0] = weighted_error
# 测试分类器
print("accuracy:", clf.score(X_test, y_test))
示例1:Adaboost分类器在鸢尾花数据集上的应用
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 加载数据
data = load_iris()
X, y = data.data, data.target
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# 创建基分类器
tree = DecisionTreeClassifier(max_depth=1, random_state=1)
# 创建Adaboost分类器
clf = AdaBoostClassifier(base_estimator=tree, n_estimators=100, learning_rate=1.0, algorithm='SAMME.R', random_state=1)
# 训练分类器
clf.fit(X_train, y_train)
# 测试分类器
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("accuracy:", accuracy)
示例2:Adaboost分类器在肝脏病数据集上的应用
from sklearn.preprocessing import Imputer
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
# 加载数据
data = load_breast_cancer()
X, y = data.data, data.target
# 填充缺失值
imp = Imputer(strategy="mean")
X = imp.fit_transform(X)
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
# 创建基分类器
tree = DecisionTreeClassifier(max_depth=1, random_state=1)
# 创建Adaboost分类器
clf = AdaBoostClassifier(base_estimator=tree, n_estimators=100, learning_rate=1.0, algorithm='SAMME.R', random_state=1)
# 训练分类器
clf.fit(X_train, y_train)
# 测试分类器
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("accuracy:", accuracy)
以上就是对Adaboost算法的详细讲解和两个示例的说明,如果想要更深入地了解Adaboost算法和机器学习相关知识,可以参考相关书籍和课程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python机器学习Sklearn实战adaboost算法示例详解 - Python技术站