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

bf71d08e01742eb3f65b8b4f83b959be.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()
11689491636872bdc88300a4743b0a71.png
b23d1ebe83b090ef4338ba7d4ce7b65c.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');
965535231a75713a4be9d282ed21820c.png
3a684e0a226b6e89a3b6862bf2371829.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()
3b56e0421be33e862869d5827e7f39ad.png
feb6dc594d1f198ab029bc4e16c6ac89.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())
2506f6286af0fc23211e2e103747f739.png
633cdf681710589e40be79c9ed4a8abb.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())
2eb33b75439e30d5ee5c2b7bd553b5f5.png
c46676799666b97bf197b3b0be5525c7.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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缔造完美运维 共谱双赢新篇

国华电力早在许久之前就曾经使用北塔网络监控产品,但由于当前国华电力信息中心的网络管理系统呈分散状态,其范围也非常有限,致使无法全面了解国华电力客户信息网中计算机及网络系统的实时运行状况,对网络资源配置及网络流量分布也…

Android 底部导航 UI框架

此版本在“一个不错的UI框架”基础上修改了首次启动底部导航没有选中Tab的情况 运行效果图如下: 1、TabView.java 这里修改的是mState-1 /********************************************************************************* Copyright (c) Weaver Info Tech Co. …

Windows在当前目录(文件)打开cmd窗口

将下面的内容保存到一个.reg文件,再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\cmdhere] "Cmd&Here"[HKEY_CLASSES_ROOT\*\shell\cmdhere\command] "cmd.exe /c start cmd.exe /k pushd \"%L\\..\&qu…

ceontos7安装mysql5.5_centos7 安装mysql5.7及配置

一、Mysql 各个版本区别:1、MySQL Community Server 社区版本,开源免费,但不提供官方技术支持。2、MySQL Enterprise Edition 企业版本,需付费,可以试用30天。3、MySQL Cluster 集群版,开源免费。可将几个M…

linux编译源码问题 环境变量的设置

本来想安装一个gkrellm-2.3.2,解压进去后,执行./configure,出现这个情况。如图1大概的意思是gtk-2.0未安装吧。然后我下载了一个gtk-2.0,执行./configure,出现这种情况。如图2大概的意思是说,这glib-2.0,atk,pango,cai…

UML——概述

1. 静态视图(类图) 静态视图不描述与时间相关的系统行为,这种行为在其他视图中描述,因此称之为静态试图。静态视图用类图来实现,正因为它以类图为中心,因此也称之为类图。在类图中类用矩形框表示&#xff0…

QT中文乱码总结

在写一个非常简单的QT源程序时遇到了中文乱码问题,所以上网搜索得到了还算比较满意的答案。 From: http://www.ctogo.net/313.html WOWCode的主体部分基本已经完成了,对于我自己来说,其实已经足以应付我的需要了,不过如果发布的话…

mysql batis传多个参数_Mybatis传多个参数(三种解决方案)

据我目前接触到的传多个参数的方案有三种。第一种方案DAO层的函数方法Public User selectUser(String name,String area);对应的Mapper.xmlselect * from user_user_t where user_name #{0} and user_area#{1}其中,#{0}代表接收的是dao层中的第一个参数&#xff0c…

78%的iPhone用户手机没有安装过新软件

78%的iPhone用户手机没有安装过新软件 最近一直在做手机的研究,也在观察用户的行为习惯。在众多的智能手机中,iphone的强大是自然的,这是一款把用户从2G时代,带到3G时代的手机。它的革命性是显而易见的,我的观察是用户…

Decorator模式

Decorator(装饰器)模式能够像标准的继承一样为类添加新的功能。 不同于标准继承机制的是,如果对象进行了实例化,Decorator模式能够在运行时动态地为对象添加新的功能。 <?php abstract class AbstractCar{public abstract function getPrice();public abstract function g…

fetch 之GET请求带参数

fetch 之GET请求带参数

mysql受影响的行 0_为什么更新/删除成功时受影响的行返回0?

我有声明&#xff1a;INSERT INTO infotbl(name, phone) VALUES(Alex, 9999999);并更新它&#xff1a;UPDATE infotbl SET name Alex Johnes, phone 999 34356063 WHERE id 1;然后删除&#xff1a;DELETE FROM infotbl WHERE id 1;当我在MySQL中更新和删除行时,我已成功插入…

手把手教你封装一个ant design的审核框组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣学习前端知识 这边先上代码 然后我们逐个解释 import React, { Component, Fragment } from react; import { Modal, Row, Form, Col, Radio, Tag, Input, message } from antd;/*** 弹框 审核* param {String…

HTML语法06

框架标签: 这个比较难解说&#xff0c;我还是通过一个例子来说吧&#xff01; 如&#xff1a; <html> <head> <title>框架实作</title> </head> <frameset cols20%,80%> <frame src"a.html" name"1"> <frame…

sgu 240 Runaway (spfa)

题意&#xff1a;N点M边的无向图&#xff0c;边上有线性不下降的温度&#xff0c;给固定入口S&#xff0c;有E个出口。逃出去&#xff0c;使最大承受温度最小。输出该温度&#xff0c;若该温度超过H&#xff0c;输出-1。 羞涩的题意 显然N*H的复杂度dp[n][h]表示到达n最大温度为…

浅谈浏览器中的preflight请求

浅谈浏览器中的preflight请求