html
掌握机器学习中的集成技术:深入探讨投票分类器和手动集成
在不断发展的机器学习领域,实现最佳模型性能通常需要利用多种算法。这就是集成技术发挥作用的地方。集成方法结合了各种模型的优势,提供比任何单一模型更准确和更强大的预测。在本综合指南中,我们将探讨两种关键的集成技术:投票分类器和手动集成。我们将通过 Python 的 scikit-learn 库实现它们,并结合 Kaggle 的天气数据集的实际示例。
目录
集成技术简介
集成学习是机器学习中的一种强大范式,其中多个模型,通常称为“弱学习器”,被策略性地组合以形成一个“强学习器”。基本前提是,虽然单个模型的准确性可能存在差异,但它们的集体智慧可以导致性能的提升、方差的减少和泛化能力的增强。
为什么使用集成技术?
- 提高准确性:结合多个模型通常会带来更好的预测性能。
- 减少过拟合:集成方法可以通过平衡单个模型的偏差和方差来缓解过拟合。
- 多功能性:适用于各种领域,并且兼容不同类型的模型。
理解投票分类器
投票分类器是最简单且最有效的集成方法之一。它结合多个不同模型的预测,并输出获得多数票的类别。
硬投票与软投票
- 硬投票:最终预测是每个模型预测类别的众数。基本上,每个模型都有一票,获得最多票数的类别获胜。
- 软投票:软投票不仅依赖于预测类别,还考虑每个类别的预测概率。最终预测基于概率的总和,选择具有最高聚合概率的类别。
在 Python 中实施投票分类器
让我们深入探讨如何使用 Python 的 scikit-learn 库进行实际实现。我们将利用一个天气数据集来预测明天是否会下雨。
1. 导入必要的库
12345678
import pandas as pdimport numpy as npimport seaborn as snsfrom sklearn.model_selection import train_test_splitfrom sklearn.impute import SimpleImputerfrom sklearn.preprocessing import OneHotEncoder, LabelEncoder, StandardScalerfrom sklearn.feature_selection import SelectKBest, chi2from sklearn.metrics import accuracy_score, classification_report
2. 数据加载和预处理
12345
# Load the datasetdata = pd.read_csv('weatherAUS - tiny.csv') # Display the last few rowsprint(data.tail())
3. 处理缺失数据
12345678910111213
# Separate features and targetX = data.iloc[:, :-1]y = data.iloc[:, -1] # Numeric columnsnumerical_cols = X.select_dtypes(include=['int64', 'float64']).columnsimputer_num = SimpleImputer(strategy='mean')X[numerical_cols] = imputer_num.fit_transform(X[numerical_cols]) # Categorical columnscategorical_cols = X.select_dtypes(include=['object']).columnsimputer_cat = SimpleImputer(strategy='most_frequent')X[categorical_cols] = imputer_cat.fit_transform(X[categorical_cols])
4. 编码分类变量
12345678
# One-Hot Encodingencoder = OneHotEncoder(drop='first', sparse=False)encoded_cols = encoder.fit_transform(X[categorical_cols])encoded_col_names = encoder.get_feature_names_out(categorical_cols)X_encoded = pd.DataFrame(encoded_cols, columns=encoded_col_names) # Combine with numerical featuresX = pd.concat([X[numerical_cols], X_encoded], axis=1)
5. 特征选择
12345678910
# Feature Scalingscaler = StandardScaler()X_scaled = scaler.fit_transform(X) # Selecting top 5 featuresselector = SelectKBest(score_func=chi2, k=5)X_new = selector.fit_transform(X_scaled, y)selected_features = selector.get_support(indices=True)feature_names = X.columns[selected_features]print(f"Selected Features: {feature_names}")
6. 训练集与测试集划分
123
X_train, X_test, y_train, y_test = train_test_split( X_new, y, test_size=0.20, random_state=1)
7. 构建单个分类器
1234567891011121314151617
from sklearn.neighbors import KNeighborsClassifierfrom sklearn.linear_model import LogisticRegressionfrom sklearn.naive_bayes import GaussianNBfrom sklearn.svm import SVCfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifier, AdaBoostClassifierimport xgboost as xgb # Initialize modelsknn = KNeighborsClassifier(n_neighbors=3)lr = LogisticRegression(random_state=0, max_iter=200)gnb = GaussianNB()svc = SVC(probability=True)dtc = DecisionTreeClassifier()rfc = RandomForestClassifier(n_estimators=500, max_depth=5)abc = AdaBoostClassifier()xgb_model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss')
8. 训练和评估单个模型
123456789101112131415161718
# List of models and their namesmodels = [ ('KNN', knn), ('Logistic Regression', lr), ('GaussianNB', gnb), ('SVC', svc), ('Decision Tree', dtc), ('Random Forest', rfc), ('AdaBoost', abc), ('XGBoost', xgb_model)] # Training and evaluatingfor name, model in models: model.fit(X_train, y_train) y_pred = model.predict(X_test) accuracy = accuracy_score(y_pred, y_test) print(f"{name} Accuracy: {accuracy:.4f}")
样本输出:
12345678
KNN Accuracy: 0.8455Logistic Regression Accuracy: 0.8690GaussianNB Accuracy: 0.8220SVC Accuracy: 0.8700Decision Tree Accuracy: 0.8345Random Forest Accuracy: 0.8720AdaBoost Accuracy: 0.8715XGBoost Accuracy: 0.8650
9. 实施投票分类器
123456789101112131415161718192021222324
from sklearn.ensemble import VotingClassifier # Initialize Voting Classifier with soft votingvoting_clf = VotingClassifier( estimators=[ ('knn', knn), ('lr', lr), ('gnb', gnb), ('svc', svc), ('dtc', dtc), ('rfc', rfc), ('abc', abc), ('xgb', xgb_model) ], voting='soft') # Train Voting Classifiervoting_clf.fit(X_train, y_train) # Predict and evaluatey_pred_voting = voting_clf.predict(X_test)voting_accuracy = accuracy_score(y_pred_voting, y_test)print(f"Voting Classifier Accuracy: {voting_accuracy:.4f}")
样本输出:
1
Voting Classifier Accuracy: 0.8650
探索手动集成方法
虽然投票分类器提供了一种直接的集成学习方法,手动集成方法通过允许自定义策略来组合模型预测,提供了更大的灵活性。本节将通过平均各个分类器的预测概率来讲解手动集成的实施过程。
手动集成实施步骤
1. 使用单个模型预测概率
12345
# Predict probabilities with KNNp1 = knn.predict_proba(X_test) # Predict probabilities with Logistic Regressionp2 = lr.predict_proba(X_test)
2. 平均概率
12
# Average the predicted probabilitiesp_avg = (p1 + p2) / 2
3. 基于平均概率的最终预测
123456
# Convert averaged probabilities to final predictionsy_pred_manual = np.argmax(p_avg, axis=1) # Evaluate accuracymanual_accuracy = accuracy_score(y_pred_manual, y_test)print(f"Manual Ensemble Accuracy: {manual_accuracy:.4f}")
样本输出:
1
Manual Ensemble Accuracy: 0.8600
实际应用:天气预测
为了说明集成技术的应用,我们将使用 Kaggle 的一个天气数据集,该数据集基于各种气象因素预测明天是否会下雨。
数据预处理
适当的数据预处理对于构建有效的机器学习模型至关重要。这包括处理缺失值、编码分类变量、选择相关特征和对数据进行缩放。
1. 处理缺失数据
- 数值特征:使用均值策略进行填补。
- 分类特征:使用最频繁策略进行填补。
2. 编码分类变量
- 独热编码:应用于具有两个以上唯一类别的分类特征。
- 标签编码:应用于二元分类特征。
3. 特征选择
使用 SelectKBest 结合卡方统计量选择与目标变量具有最强关系的前5个特征。
4. 特征缩放
应用 StandardScaler 来规范化特征集,确保每个特征在模型性能中均等贡献。
模型构建
构建并评估了几个单独的分类器,包括 K 近邻、逻辑回归、高斯朴素贝叶斯、支持向量机、决策树、随机森林、AdaBoost 和 XGBoost。
评估集成方法
实施了投票分类器和手动集成,以评估它们相对于单个模型的性能。
结论
集成技术,特别是投票分类器和手动集成,是机器学习从业者的宝贵工具。通过策略性地结合多个模型,这些方法提高了预测性能,降低了过拟合的风险,并利用了多种算法的优势。无论您是追求更高的准确性还是更强健的模型,掌握集成方法都能显著提升您的机器学习项目。
关键要点:
- 投票分类器:通过多数投票或概率平均,提供了一种简单而有效的组合多个模型的方法。
- 手动集成:提供了对如何组合预测的精细控制,允许定制策略,能够超越标准化的集成方法。
- 数据预处理:确保您的模型在干净、结构良好的数据上进行训练,这是集成技术效果的直接影响因素。
- 模型评估:始终将集成方法与单个模型进行比较,以验证其附加价值。
拥抱集成学习,释放您的机器学习模型的全部潜力,在项目中推动更准确、可靠的预测。
关键词:集成技术,投票分类器,手动集成,机器学习,Python,scikit-learn,模型准确性,数据预处理,特征选择,天气预测,K 近邻,逻辑回归,高斯朴素贝叶斯,支持向量机,决策树,随机森林,AdaBoost,XGBoost