不愧是腾讯,基础面试巨细节。。。
哈喽,我是kk~
最近,又有同学面试了腾讯的算法岗位,这次,面试中聊的基础内容居多,而且很细致。
大家可以看下~
除了上面的,关于adaboost的问题问了好多。
今天咱们也和大家分享一下关于Adaboost的内容~
Adaboost,全称为“Adaptive Boosting”,是一种强大的集成学习算法,通过结合多个弱分类器来创建一个强分类器。
Adaboost 原理
Adaboost通过加权多数投票机制来增强分类器的性能。其主要思想是反复调整数据样本的权重,使得那些被前一轮分类错误的样本在后续的分类器训练中受到更多关注。
1. 初始化权重:
初始化每个训练样本的权重为
,其中
是样本数量。
2. 训练弱分类器:
使用带权重的数据训练一个弱分类器。计算该分类器的分类误差率
。
3. 计算弱分类器权重:
根据分类误差率计算该弱分类器的权重:
其中
是弱分类器的权重,
是分类误差率。
4. 更新样本权重:
更新样本权重,使得分类错误的样本权重增加,分类正确的样本权重减少:
其中
是样本的真实标签,
是弱分类器的预测结果。
5. 归一化权重:
将样本权重归一化,使其和为1。
6. 最终分类器:
最终的强分类器是所有弱分类器的加权和:
实际案例:手写数字识别
下面,使用Adaboost算法进行手写数字识别任务。
from sklearn.datasets import load_digitsfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerdigits = load_digits()X = digits.datay = digits.target# 将标签二值化,只识别数字0与非0y = (y == 0).astype(int)# 数据集分割X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 数据标准化scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)
模型训练
我们使用Scikit-learn中的AdaBoostClassifier进行训练。
from sklearn.ensemble import AdaBoostClassifierfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.metrics import accuracy_score, confusion_matriximport matplotlib.pyplot as pltimport seaborn as sns# 使用决策树作为弱分类器base_estimator = DecisionTreeClassifier(max_depth=1)# Adaboost模型model = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=50, learning_rate=1.0, random_state=42)model.fit(X_train, y_train)# 预测y_pred = model.predict(X_test)# 计算准确率accuracy = accuracy_score(y_test, y_pred)print(f"Test Accuracy: {accuracy * 100:.2f}%")# 混淆矩阵conf_mat = confusion_matrix(y_test, y_pred)
可视化结果
我们使用Seaborn库绘制混淆矩阵和训练过程中的错误率曲线。
# 绘制混淆矩阵plt.figure(figsize=(10, 7))sns.heatmap(conf_mat, annot=True, fmt='d', cmap='Blues', xticklabels=['Non-0', '0'], yticklabels=['Non-0', '0'])plt.xlabel('Predicted')plt.ylabel('Actual')plt.title('Confusion Matrix')plt.show()
# 错误率曲线error_rate = []for i, y_pred_iter in enumerate(model.staged_predict(X_train)): error_rate.append(1 - accuracy_score(y_train, y_pred_iter))plt.figure(figsize=(10, 7))plt.plot(range(1, len(error_rate) + 1), error_rate, marker='o')plt.xlabel('Number of Estimators')plt.ylabel('Error Rate')plt.title('Training Error Rate vs Number of Estimators')plt.show()
下面,大概聊聊代码~
1. 数据预处理: 加载手写数字数据集,并将其分为训练集和测试集。然后,将标签二值化,只识别数字0与非0,并进行数据标准化处理。
2. 模型训练: 选择了决策树作为弱分类器,并使用AdaBoostClassifier进行训练。训练完成后,我们对测试集进行预测并计算准确率。
3. 结果可视化: 绘制混淆矩阵,展示模型在测试集上的表现。同时,绘制训练过程中的错误率曲线,展示随着弱分类器数量的增加,模型的错误率如何变化。
Adaboost算法在手写数字识别任务中表现出色,通过调整弱分类器的权重和组合,可以有效提高模型的准确率。混淆矩阵展示了模型的分类性能,错误率曲线展示了模型的收敛过程。
最后
好了,今天的内容先这样,继续想看解决什么问题,评论区留言~