多分类问题识别实验者状态
最近收到挺多粉丝留言,询问这个问题。
一、数据处理。
首先我们导入一些必要的库
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)
和上面一样调了很久的参,果真是调参杀我。
四、结语
以上就是全部的内容了,希望有兴趣的小伙伴多发些案例来给我做一下,让我在实战中成长。