多分类问题识别实验者状态

多分类问题识别实验者状态

最近收到挺多粉丝留言,询问这个问题。

一、数据处理。

首先我们导入一些必要的库

import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
import os
# 解决图片显示以及中文负号乱码问题
%matplotlib inline
plt.rcParams['font.family'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

然后是读取文件部分
文件结构是将数据集文件和.ipynb文件放在同一目录下

def readfile(filePath,i):
    Datalist = os.listdir(filePath+str(1))
    Data = pd.read_csv(filePath+str(1)+'\\'+Datalist[i])
    for x in range(2,4):
        datalist = os.listdir(filePath+str(x))
        data = pd.read_csv(filePath+str(x)+'\\'+datalist[i])
        Data = Data.append(data)
    return Data
filePath = 'Data Source\Data Set_'
right = readfile(filePath,0)
left = readfile(filePath,1)
meditation = readfile(filePath,2)
meditation_R = readfile(filePath,3)
meditation_L = readfile(filePath,4)

为多个状态添加标签值

right['label'] = 1
left['label'] = 2
meditation['label'] = 3
meditation_L['label'] = 4
meditation_R['label'] = 5

将数据整合在一起

# 将所有数据拼接在一起
data1 = right.append(left,ignore_index= False)
data2 = data1.append(meditation,ignore_index= False)
data3 = data2.append(meditation_L,ignore_index= False)
Data = data3.append(meditation_R,ignore_index= False)
# Data.to_csv('Data.csv')

最后Data就是我们要使用的数据集了,最后一行注释代码是将这个数据文件保存,下次另外使用的时候就可以不需要前面的步骤了。
接下来我们可以看一下数据分布的情况,这里采用了三种方法,第一个是matplotlib里面的bar,即柱状图,第二个是绘制的饼图可以看看数据的占比是什么,第三个是pandas自带的画图模块绘制的雷达图。接下来我们一一查看一下吧!

# 查看每种标签值有多少
x = [1,2,3,4,5]
c1 = Data[Data['label'] == 1].shape[0]
c2 = Data[Data['label'] == 2].shape[0]
c3 = Data[Data['label'] == 3].shape[0]
c4 = Data[Data['label'] == 4].shape[0]
c5 = Data[Data['label'] == 5].shape[0]
y = [c1,c2,c3,c4,c5]
plt.bar(x,y,color='rgb')
for a, b in zip(x, y):
    plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=11)
plt.show()

在这里插入图片描述
1,2,3,4,5标签分别代表着不同的状态。下面看看饼图的情况吧。

size = [c1/Data.shape[0],c2/Data.shape[0],c3/Data.shape[0],c4/Data.shape[0],c5/Data.shape[0]]
explode = (0,0,0.1,0,0)
labels = ['举右手','举左手','冥想','冥想举右手','冥想举左手']
plt.pie(size,explode=explode,labels=labels,autopct='%1.1f%%')
plt.title("各标签所占比例图")

在这里插入图片描述
下面看看雷达图:

pd.plotting.radviz(Data, 'label')

在这里插入图片描述
接下来进行数据预处理的操作。

二、数据预处理

这里使用主成分分析对数据进行处理

X = Data.drop('label',axis = 1)
y = Data['label']
# 主成分分析
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X = scaler.fit_transform(X)

pca = PCA(n_components = 0.999)
X = pca.fit_transform(X)

数据处理完之后就可以分割数据集了,然后构建模型了

# 分割数据集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X , y , test_size = 0.2 , random_state = 123)

三、构建模型

我在这里选取了三个对多分类模型都比较好的模型,分别是随机森林模型,KNN,以及MLP模型对数据进行拟合,训练。
下面写了一个模型评估函数

3.1 随机森林模型
# 绘制混淆矩阵
def plot_confusion_matrix(cm, classes=None, title='Confusion matrix'):
    if classes is not None:
        sns.heatmap(cm, xticklabels=classes, yticklabels=classes, vmin=0., vmax=1., annot=True)
    else:
        sns.heatmap(cm, vmin=0., vmax=1.)
    plt.title(title)
    plt.ylabel('True label')
    plt.xlabel('Predicted label')

# 模型评估一般标准
def model_performance_evaluation(model_name, test, pred):
    print(model_name,  '| Accuracy: %.4f' % accuracy_score(test, pred))
    print(model_name, '| Confusion matrix:\n', confusion_matrix(test, pred))

然后第一个是随机森林模型的构建

from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.metrics import  accuracy_score,confusion_matrix,classification_report
RfClf = RandomForestClassifier(n_estimators =600,oob_score=True,bootstrap=True,n_jobs=4,random_state = 123)
RfClf.fit(X_train,y_train)
predict_train2 = RfClf.predict(X_train)
predict_test2 = RfClf.predict(X_test)

对模型的评估看一下结果

# 查看一下数据在训练集上的表现效果
cm = confusion_matrix(y_train,predict_train2)
cm_norm = cm/cm.sum(axis=1)[:, np.newaxis]
plt.figure()
plot_confusion_matrix(cm_norm, classes=RfClf.classes_, title='Training confusion')
model_performance_evaluation(model_name,y_train,predict_train2)

在这里插入图片描述
在这里插入图片描述
看到准确率有1这么高,可是不能高兴啊,这是在训练集上的模型,八成是过拟合了。看看测试集上的表现再说吧。

cm = confusion_matrix(y_test,predict_test2)
cm_norm = cm/cm.sum(axis=1)[:, np.newaxis]
plt.figure()
plot_confusion_matrix(cm_norm, classes=RfClf.classes_, title='Testing confusion')
model_performance_evaluation(model_name,y_test,predict_test2)

在这里插入图片描述
在这里插入图片描述
果然是过拟合了,调了很多次参数也没有弄好,果断放弃了。换一个模型吧。

3.2 KNN模型

这里只贴出模型构建的代码,因为其他的模型评估部分有函数了,都差不多的。

from sklearn.neighbors import KNeighborsClassifier
k = 5
knn = KNeighborsClassifier(n_neighbors = k)
knn.fit(X_train,y_train)
y_pred = knn.predict(X_test)

因为是五分类问题,所以K值我选了5但最后试了一下还是k=1的时候准确率最高了有71%左右吧 。
在这里插入图片描述
在这里插入图片描述

3.3 神经网络模型
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(hidden_layer_sizes = (400,400),random_state = 753)
mlp.fit(X_train,y_train)
y_pred = mlp.predict(X_test)

和上面一样调了很久的参,果真是调参杀我。
在这里插入图片描述
在这里插入图片描述

四、结语

以上就是全部的内容了,希望有兴趣的小伙伴多发些案例来给我做一下,让我在实战中成长。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值