xgboost分类_用Sci-kit learn和XGBoost进行多类分类:Brainwave数据案例研究

本文探讨了在高维数据集EEGBrainwaveDataset上,随机森林和逻辑回归分类器的性能。通过10折交叉验证,随机森林展现出了97.7%的高准确率,而逻辑回归的准确率为93.19%,但需要进行特征缩放。为了减少特征数量和处理多重共线性,文章提到了主成分分析(PCA),并指出PCA可能有助于优化模型性能和减少计算时间。
摘要由CSDN通过智能技术生成
641de944bf47736030a5f27df287c217.png

在机器学习中,高维数据的分类问题非常具有挑战性。有时候,非常简单的问题会因为这个“维度诅咒”问题变得非常复杂。在本文中,我们将了解不同分类器的准确性和性能是如何变化的。

理解数据

对于本文,我们将使用Kaggle的“EEG Brainwave Dataset”(https://www.kaggle.com/birdy654/eeg-brainwave-dataset-feeling-emotions) 。该机器学习数据集包含来自EEG headset的电子脑电波信号,并且是时间格式的。

首先,让我们先读取数据,Python代码如下:

import pandas as pdbrainwave_df = pd.read_csv('../data/emotions.csv', index_col=False)brainwave_df.head()
daf75a296f92d855cd74632714301837.png
41f7ff494effb1abe003ff8aa2c6add5.png

该机器学习数据集中有2549列,“label”是我们分类问题的目标列。其他所有列,如“mean_d_1_a”、“mean_d2_a”等,都描述了脑电波信号读取的特征。以“fft”前缀开始的列很可能是原始信号的“快速傅里叶变换”。我们的目标列“label”描述了情绪的程度。

正如Kaggle所说,这是一个挑战:“我们能从脑电波读数预测情绪吗?”

让我们首先理解列'label'中的类分布,Python代码如下:

import seaborn as snsimport matplotlib.pyplot as pltplt.figure(figsize=(12,5))sns.countplot(x=brainwave_df.label, color='mediumseagreen')plt.title('Emotional sentiment class distribution', fontsize=16)plt.ylabel('Class Counts', fontsize=16)plt.xlabel('Class Label', fontsize=16)plt.xticks(rotation='vertical');
b3cbc8a704c3c9515515bca65659cb1c.png
99b411aea2cfe322ab7402eed0625909.png

图1

因此,情绪有三个类别,“POSITIVE(正面)”,“NEGATIVE(负面)”和“NEUTRAL(中性)”。从条形图中可以清楚地看出,类分布没有偏态,它是一个带有目标变量“label”的“多类分类”问题。我们将尝试不同的分类器,看看准确度。

在应用任何分类器之前,应将“label”列与其他特征列分开('mean_d_1_a','mean_d2_a'等是特征)。

label_df = brainwave_df['label']brainwave_df.drop('label', axis = 1, inplace=True)brainwave_df.head()
512de41fa411dd35374e96f7fffe2f24.png
ff469fcfaea1bc0dfa5e4f4523019ff5.png

由于这是一个“分类”问题,我们将按照以下约定对每个“分类器”进行尝试:

  1. 我们将在机器学习数据集上使用“交叉验证”(在我们的例子中将使用10 fold交叉验证)方法并取平均准确度。这将为我们提供分类器准确性的整体视图。
  2. 我们将使用基于“管道”的方法将所有预处理和主分类器计算结合起来。机器学习(ML)“管道”将所有处理阶段封装在一个单元中,并充当“分类器”本身。这样,所有阶段都可重用,并可用于形成其他“管道”。
  3. 我们将跟踪每种方法的构建和测试的总时间。

对于上述内容,我们将主要使用Python中的scikit-learn包。由于这里的特征数量非常多,因此将从一个适用于高维数据的分类器开始。

随机森林分类器

随机森林是一种基于树和bagging方法的集成分类器。采用概率熵计算方法,自动减少特征个数。让我们看看Python实现:

%%timefrom sklearn.pipeline import Pipelinefrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import cross_val_score, train_test_splitpl_random_forest = Pipeline(steps=[('random_forest', RandomForestClassifier())])scores = cross_val_score(pl_random_forest, brainwave_df, label_df, cv=10,scoring='accuracy')print('Accuracy for RandomForest : ', scores.mean())
ff0d8ca91c459ae95bf9f83ac8a0249a.png
5aab33421ab518bb90621b478cc87468.png

准确度非常好,达到97.7%,“总时间”非常短(仅限3.29秒)。

对于该分类器,不需要诸如缩放或噪声去除之类的预处理阶段,因为它完全基于概率并且完全不受缩放因子的影响。

逻辑回归分类器

“逻辑回归”是一种线性分类器,其工作方式与线性回归相同。

%%timefrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressionpl_log_reg = Pipeline(steps=[('scaler',StandardScaler()), ('log_reg', LogisticRegression(multi_class='multinomial', solver='saga', max_iter=200))])scores = cross_val_score(pl_log_reg, brainwave_df, label_df, cv=10,scoring='accuracy')print('Accuracy for Logistic Regression: ', scores.mean())
31c2723b35a795b99aff5fd24b8cd120.png
2d128448a11ba3d70039a4fb7287b9e2.png

我们可以看到准确度(93.19%)低于'RandomForest','时间'更高(2分7秒)。

“逻辑回归”受到因变量的不同值范围的严重影响,因此强制“特征缩放”。这就是为什么来自scikit-learn的'StandardScaler'被添加为预处理阶段的原因。它根据具有零均值和单位方差的高斯分布自动缩放特征,因此所有变量的值范围从-1到+1。

花费大量时间的原因是因为高维性和缩放时间。数据集中有2549个变量,每个变量的系数应根据逻辑回归过程进行优化。此外,还有一个多重共线性的问题。这意味着线性相关变量应该组合在一起,而不是单独考虑它们。

多重共线性的存在影响准确性。所以现在的问题是,“我们能否减少变量的数量,减少多重共线性,并改善'花费的时间'呢?”

主成分分析(PCA)

PCA可以将原始的低级变量转换为更高维的空间,从而减少所需变量的数量。所有的共线性变量聚在一起。让我们做一个PCA的数据:

from sklearn.decomposition import PCAfrom sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaled_df = scaler.fit_transform(brainwave_df)pca = PCA(n_components = 20)pca_vectors = pca.fit_transform(scaled_df)for index, var in enumerate(pca.explained_variance_ratio_): print("Explained Variance ratio by Principal Component 
在PsychoPy工具包(一个用于创建视觉、听觉和交互式实验的心理学研究环境)中,如果你想在Coder模式下处理NeuroScan脑电设备的数据(通常使用eeglab标记),你需要做以下几个步骤: 1. **安装依赖**: - 首先,确保已经安装了PsychoPy及其附加库,如`pyglet`和` PsychoPy.hardware`,以及`mne`(用于处理神经科学数据)。 ``` pip install psychoPy pyglet mne ``` 2. **导入所需模块**: ```python from psychopy import visual, core, event, gui from mne.io import read_raw_neuromag, pick_types ``` 3. **读取数据**: 使用`read_raw_neuromag`函数从NeuroScan .set或.edf文件中读取数据。例如: ```python raw = read_raw_neuromag('your_data.set') ``` 4. **预处理数据**: 调整时间基线,去除眼动或其他干扰信号,然后可能需要将数据转换为适合PsychoPy的时间窗口(epochs): ```python epochs = mne.preprocessing.create_epochs(raw, events=your_events_list) ``` 5. **标记事件**: 根据你的实验设计,在`events`列表中添加脑电标记,这可以基于脑电波形的特定特征或触发器信号: ```python events_dict = {'Brainwave Mark': [epoch_number for epoch in epochs]} ``` 6. **创建试验结构**: 在PsychoPy的Coder模式下,你可以构建你的试验结构,同时结合脑电事件来触发相应的行为或显示内容。 7. **运行实验**: 在试验循环中,检查事件列表并相应地响应脑电信号标记: ```python while True: for trial_event in events_dict: if trial_event in event.getKeys(): # 执行与脑电标记关联的操作 break # ...其他试验逻辑... ``` 请注意,具体的实现会根据你的实验设计和NeuroScan数据的具体格式有所不同。以上代码仅为示例,实际操作时可能需要根据实际情况调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值