# -*- coding: utf-8 -*- 支持文件中出现中文字符
#########################################################################
"""
Created on 9 17 20:35 2020
代码功能描述:(1)读取train_data和train_event数据文件
(2)提取P300信号数据并输出
"""
#####################################################################
import matplotlib.pyplot as plt # 进行绘图的相关模块
from scipy import signal # SciPy的signal信号处理用子模块
import pandas as pd # 数据框数据处理分析
import numpy as np # 数组数据处理分析
import math # 数学运算模块
from sklearn.model_selection import train_test_split # 进行数据随机划分模块
from sklearn.model_selection import GridSearchCV # 网络搜索模块用于优化参数
from sklearn import metrics # 用于得到评价信息
from sklearn.ensemble import RandomForestClassifier # 用于引入随机森林模型
import warnings # python警告模块
from sklearn.svm import SVC
warnings.filterwarnings("ignore")
# 读入数据
#################################################################################################
def create_data(data_name,sheetname):
dataSet = [] # 保存数据集
Data = pd.read_excel(data_name,sheet_name=sheetname,header=None)
for row in Data.itertuples(): # 遍历数据
row1 = list(row)
del row1[0] # 除去索引列
dataSet.append(row1)
return dataSet
#################################################################################################
################################################################################################
def getdata(dataaddress): # 提取P300数据
xl = pd.ExcelFile(dataaddress)
sheet_names = xl.sheet_names # 获取sheet名称
#allsleep_data={'6','5','4','3','2'}
sleep_data=[]
for sheet_name in sheet_names: # 获取event和data数据
sleep_data.extend(create_data(dataaddress,sheet_name))
return sleep_data
def to_train_model(train_data_x,train_data_y): # 利用网络搜索优化参数,得到最优的训练模型,并且返回最优的训练模型
n_estimators = [100,135,170,200,225]
max_depth = list(range(6,9))
rfgs = RandomForestClassifier(oob_score=True,random_state=1)
para_grid = [{"n_estimators":n_estimators,"max_depth":max_depth}]
gs_rf = GridSearchCV(estimator=rfgs,param_grid=para_grid,n_jobs=3)
all_gs_rfs = gs_rf.fit(train_data_x,train_data_y)
best_rf_params = all_gs_rfs.best_params_
print(all_gs_rfs.best_score_)
print(best_rf_params)
return best_rf_params
def to_evalate_model(rf_best_params,test_data_x,test_data_y,train_x,train_y): # 评价模型得到混淆矩阵输出相关信息
final_rf = RandomForestClassifier(n_estimators=rf_best_params['n_estimators'],max_depth=rf_best_params['max_depth'])
final_rf.fit(train_x,train_y)
y_model_predict = final_rf.predict(test_data_x)
print("预测的正确率为:",round(metrics.accuracy_score(test_data_y,y_model_predict),4)*100,"%")
confusion_mat = metrics.confusion_matrix(test_data_y,y_model_predict) # 输出混淆矩阵
class_label = ['class-1','class-0']
confusion_mat_dataframe = pd.DataFrame(confusion_mat,columns=class_label,index=class_label)
print(" 混淆矩阵输出为:" )
print(confusion_mat_dataframe)
print(metrics.classification_report(test_data_y,y_model_predict,target_names = class_label))# classification_report
def del_signal(orignal_data): # 滤波函数
fs = 3000 # 设立频率变量fs
lowcut = 1
highcut = 30
order = 2 # 设立滤波器阶次变量
nyq = 0.5 * fs # 设立采样频率变量nyq,采样频率=fs/2。
low = lowcut / nyq
high = highcut / nyq
b, a = signal.butter(order, [low, high], btype='band') # 设计巴特沃斯带通滤波器 “band”
after_data = signal.lfilter(b, a, orignal_data) # 将s1带入滤波器,滤波结果保存在s1_filter1中
return after_data # 返回滤波后的数据
################################################################################################
address='G:\Personal Files\文档\数学建模\做\\2020年C题\附件1-P300脑机接口数据'
dataname=address+'\S1_P3.xlsx'
data1=create_data(dataname,'s1_p3(1)')
data0=create_data(dataname,'s1_p3(0)')
tdata=create_data(address+'\S1Test.xlsx','s1test)')
all_y1=[1]*len(data1)
all_y0=[0]*len(data0)
all_y1.extend(all_y0)
lable=all_y1
data1.extend(data0)
all_data=data1
all_data=np.array(all_data).T
all_data=all_data.tolist()
all_data=np.array(all_data).T
all_data=all_data.tolist()
train_x,test_x,train_y,test_y = train_test_split(all_data, lable,test_size=0.3, random_state=0) # 进行数据划分
rf_best_params=to_train_model(train_x,train_y) # 进行模型训练,同时使用网络搜索找到更合适的参数并且返回,rf_best_params:最优模型的参数
final_rf = RandomForestClassifier(n_estimators=rf_best_params['n_estimators'],max_depth=rf_best_params['max_depth'])
final_rf.fit(train_x,train_y)
y_model_predict = final_rf.predict([tdata[7]])
print(y_model_predict)
#to_evalate_model(rf_best_params,test_x,test_y,train_x,train_y) # 得到模型评价,输出混淆矩阵
'''
writerD= pd.ExcelWriter(address+"\S120×120.xlsx") #要保存计算结果的文件名
data={}
datamean={}
datamean['1']=[]
datamean['0']=[]
datamean['2']=[]
data['1']=create_data(dataname,'s1_p3(1)')
data['0']=create_data(dataname,'s1_p3(0)')
data['2']=create_data(dataname,'s1')
for sindata in data['1']:
#print(sindata)
tempmean=[]
for i in range(0,len(sindata),150):
tempmean.append(np.mean(sindata[i:i+150]))
datamean['1'].append(tempmean)
for sindata in data['0']:
tempmean=[]
for i in range(0,len(sindata),150):
tempmean.append(np.mean(sindata[i:i+150]))
datamean['0'].append(tempmean)
for sindata in data['2']:
tempmean=[]
for i in range(0,len(sindata),150):
tempmean.append(np.mean(sindata[i:i+150]))
datamean['2'].append(tempmean)
print(datamean['2'][0])
all_y1=[1]*len(datamean['1'])
all_y0=[0]*len(datamean['0'])
print(len(all_y1),len(all_y0))
all_y1.extend(all_y0)
datamean['1'].extend(datamean['0'])
all_X=datamean['1']
DataSD = pd.DataFrame(list(all_X)) # 输出p300信号值
DataSD.to_excel(writerD, sheet_name='datamean)',header=None,index=False)
DataSD = pd.DataFrame(list(all_y1)) # 输出p300信号值
DataSD.to_excel(writerD, sheet_name='lable)',header=None,index=False)
writerD.save()
clf=SVC(C=5,kernel='rbf',gamma=20,decision_function_shape='ovo') # ovr:一对多策略
clf.fit(all_X,all_y1)
print(clf.predict(datamean['2']))
'''
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
内容概要: 本资源为【数学建模】2020年C题——睡眠分期题目的Python处理代码。该代码旨在帮助参赛者分析和处理与睡眠分期相关的数据,包括数据加载、预处理、特征提取、模型构建与训练,以及结果输出等步骤。代码采用了Python语言编写,充分利用了pandas、numpy、scipy等科学计算库的功能,实现了对睡眠数据的自动化处理和分析。 使用人群: 本资源适用于参加数学建模竞赛的参赛者,特别是针对睡眠分期类似题目的参赛者。 使用场景及目标: 本资源的使用场景为数学建模竞赛中的数据处理和分析环节。使用本代码可以帮助参赛者快速有效地处理睡眠分期数据,提取有用的特征,并构建分类模型来识别不同的睡眠阶段。 其他说明: 本代码仅为示例代码,具体实现可能需要根据实际数据和题目要求进行适当的修改和调整。 在使用本代码前,请确保已经安装了Python及其相关科学计算库,pandas、numpy、scipy等。 本代码仅为参赛者提供一个参考和起点,参赛者需要根据自己的理解和创新,进一步完善和优化代码,以达到更好的竞赛效果。
资源推荐
资源详情
资源评论
收起资源包目录
【数学建模】2020年C题 睡眠分期题目 Python处理代码(全).zip (5个子文件)
睡眠分期.py 6KB
可视化.py 4KB
提取P300.py 6KB
test可视化.py 6KB
分类.py 7KB
共 5 条
- 1
资源评论
Huaznnnn
- 粉丝: 76
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功