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

理解数据

对于本文,我们将使用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()

该机器学习数据集中有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');

图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()

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

  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())

准确度非常好,达到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())

我们可以看到准确度(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 

python 高维数据_用Sci-kit learn和XGBoost进行多类分类:Brainwave数据案例研究相关推荐

  1. python多标签分类_解决多标签分类问题(包括案例研究)

    由于某些原因,回归和分类问题总会引起机器学习领域的大部分关注.多标签分类在数据科学中是一个比较令人头疼的问题.在这篇文章中,我将给你一个直观的解释,说明什么是多标签分类,以及如何解决这个问题. 1.多 ...

  2. imp 只导表前10条数据_做电商设计,你必须懂的10条数据指标

    数据指标是什么?--是一个切入数据的角度.有了数据指标的存在,才能知道需要采集什么数据.需要持续监测什么数据.用什么角度来和历史表现做对比. 数据指标的类型各种各样,有些指标是被广泛使用的,如 DAU ...

  3. python通过api获取数据_在一次点击PythonRequests中从API获取所有数据

    import requests url = 'http://www.justdial.com/autosuggest.php?' param = { 'cases':'popular', 'strtl ...

  4. learn python中文版 买_安装和准备 | Learn Python the Hard Way 中文版

    附录A-练习1:安装 本附录中,你需要完成3件事: 用你的终端做一些事情 (command line, Terminal, PowerShell). 了解你做过的事情. 自己多练习. 在第一个练习中, ...

  5. python数据分析实况_机器学习竞赛分享:通用的团队竞技类的数据分析挖掘方法...

    前言 该篇分享来源于NFL竞赛官方的R语言版本,我做的主要是翻译为Python版本: 分享中用到的技巧.构建的特征.展示数据的方式都可以应用到其他领域,比如篮球.足球.LOL.双人羽毛球等等,只要是团 ...

  6. python 估值模型_利用RFM模型建模,并通过聚类分析、分类,分别算出8中不同的价值会员...

    RFM-Clustering 利用RFM模型建模,并通过聚类分析.分类,分别算出8中不同的价值会员 RFM模型构建会员价值标签 R:最近一次消费(Recency) F:消费频率(Frequency) ...

  7. python 数据结构转换层_[mcj]使用OpenCV深度学习进行性别和年龄分类(C++/Python)...

    在本教程中,我们将讨论应用于面部的深度学习的有趣应用.我们将估计年龄并从单个图像中找出该人的性别.该模型由Gil Levi和Tal Hassner训练.我们将简要讨论本文的主要思想,并提供有关如何在O ...

  8. mangodb 高频数据_【mongoDB高级篇③】综合实战(1): 分析国家地震数据

    数据准备 通过navicat导入到数据库,方便和mysql语句做对比 shard分片集群配置 # step 1 mkdir -p ./data/shard/s0 ./data/shard/s1 #创建 ...

  9. bootstraptable获取所有数据_一键获取oracle用户下所有表的表名与其数据量

    概述 作为DBA,对数据库中表段.索引段之类的数量,大概的级别是需要有个大致了解的,今天主要分享一个存储过程,可以很实用的获取到oracle用户下所有表的表名与其数据量. 查询当前用户名下所有表 se ...

最新文章

  1. 境外 java 中文乱码_Java前后端交互中文出现乱码??
  2. 【Linux】21.Linux输入输出重定向、2>1、标准输入、标准输出、标准错误
  3. Microsoft Office Visio
  4. Qt学习之路(1)------Qt常用类用法说明
  5. MySQL教程(一)—— 数据库设计
  6. 通往大神之路,百度Java面试题前200页。
  7. SharePoint学习札记[3] — Office SharePoint Server 2007部署
  8. 基于Text-CNN模型的中文文本分类实战
  9. Springboot的常规属性配置和类型安全配置
  10. 敏捷开发般若敏捷系列之三:什么是敏捷(下)(无住,不住于空,破空执,非法,非非法)...
  11. 数控常见的几种国内外数控系统,你都熟悉吗
  12. php 上传微信媒体,关于微信公众号API多媒体上传
  13. ART-Pi 实现音乐播放器 --播放《天空之城》
  14. 12306自动抢票软件
  15. Windows安装ElasticSearch 7.3.0
  16. 在python中get是什么意思_python get函数有什么作用?示例解析
  17. 3 WOW的各种文件的格式(WOWMapView Group)
  18. R语言 RStudio快捷键
  19. 基于python的BMI指数计算器
  20. 不少人都想了解网络安全培训内容有哪些?这篇文章会很详细的告诉你

热门文章

  1. java自动依照日期建表,脚本根据一个表中的日期字段填充每月汇总表
  2. hide show vue 动画_(Vue动效)7.Vue中动画封装
  3. nginx 二进制包安装mysql_二进制安装mysql5.7
  4. Linux设备驱动入门----globalmem字符设备驱动
  5. Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程
  6. mac无法ssh localhost
  7. 解决vuex中store保存数据,刷新页面会清空得问题
  8. [react] 举例说明什么是高阶组件(HOC)的属性代理
  9. [react] React组件的构造函数是必须的吗?
  10. [html] websocket和http2有什么区别?http2能取代websocket吗?为什么?