栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python将.arff文件转换为.mat文件

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python将.arff文件转换为.mat文件

ps: 最近做实验进行数据处理的时候需要将下载的.arff格式文件转换成.mat文件,过程不太顺利,总结一下放在这儿。

普通.arff文件转换

该过程比较简单,百度照着敲得,贴一个代码:

from scipy.io import arff
import pandas as pd
import scipy.io as sio
import numpy as np
from sklearn.preprocessing import OrdinalEncoder,OneHotEncoder

file='D:/机器学习/SPkEL/dataset/WaterQuality.arff'
data,meta=arff.loadarff(file)
df=pd.DataFrame(data)

train_data=df.iloc[:,:-14]
train_target=df.iloc[:,-14:]

# encoder=OneHotEncoder()
# endode_data=encoder.fit_transform(train_data[['gender']]).toarray()

# encoder=OrdinalEncoder()
# endode_data=encoder.fit_transform(train_data[['gender']])

# encoder.categories_

# train_data['gender']=endode_data
# coder_df=pd.DataFrame(endode_data,columns=['divorced', 'married', 'single'])
# train_data=pd.concat([train_data,coder_df],axis=1)

train_data=train_data.values
train_target=np.array(train_target.values,dtype=int)
save_file='D:/机器学习/SPkEL/data/data/WaterQuality.mat'
sio.savemat(save_file,{"data":train_data,"targets":train_target})

上面的代码夹杂着两种编码——OrdinalEncoder,OneHotEncoder,也顺带mark一下~

压缩矩阵(稀疏矩阵)
  • 需要安装scikit-multilearn包:pip install scikit-multilearn;
  • 有些会提示安装arff包,如果安装了需要先pip uninstall 卸载掉,重新安装liac-arff:pip install liac-arff;
  • 不能在jupyter notebook中进行编译(我试过,一直没有成功)
  • 在进行转换前需要用记事本打开,看看标签数和标签的位置(start or end)

其中一个案例是Medical,如果用上面的方式访问文件,会报错:

ValueError: {80 1 value not in ('0', '1')

如果用jupyter notebook访问,会报错:

AttributeError: module 'arff' has no attribute 'DENSE'

成功的代码:

import pandas as pd
import scipy.io as sio
import numpy as np
from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder
from skmultilearn.dataset import load_from_arff

file = 'D:/机器学习/SPkEL/dataset/Medical.arff'

train_data, train_target = load_from_arff(file, label_count=45, label_location='end', input_feature_type='int',
                                        encode_nominal=False,
                                          load_sparse=False, return_attribute_definitions=False)
train_data = train_data.toarray()
train_target = train_target.toarray()

save_file = 'D:/机器学习/SPkEL/data/data/Medical.mat'
sio.savemat(save_file, {"data": train_data, "targets": train_target})

还有一个是20NG,这个文件的格式和上面的Medical又有点不一样,通过观察它的特点,我慢慢试出来的(先改参数值,还不行就删参数)~(好绝望,对这一块太不熟了,没有百度到,害)
可能会报的错:

TypeError: no supported conversion for types: (dtype(' 

成功的代码:

import scipy.io as sio
import numpy as np
from skmultilearn.dataset import load_from_arff

file = 'D:/机器学习/SPkEL/dataset/20NG.arff'
train_data, train_target = load_from_arff(file, label_count=20, label_location='start')
train_data = train_data.toarray()
train_target = train_target.toarray()

save_file = 'D:/机器学习/SPkEL/data/data/20NG.mat'
sio.savemat(save_file, {"data": train_data, "targets": train_target})

以为上面就结束了?
别急,还有一个,Slashdot,我用上面的代码运行时,出现了一个不一样的错误:

arff.BadRelationFormat: Bad @RELATION format, at line 1.

于是,我用记事本打开了该文件,对比它的第一行和20NG文件的第一行,直接删了不同的地方(哈哈,的确有点暴力),但至少成功了,如果有问题,后面再说吧:
修改前:@relation ‘Slashdot: -C 22 -split-number 1891’ %50
修改后:@relation ‘Slashdot: -C 22’
噢,对了,不知道各位有没有发现,每个数据的第一行的“ -C **”有指明该数据有多少个标签(类别)哦,不要像我刚开始一样傻傻的去数~
害,就先这样吧,今天大部分时间都来搞这个了,我丢。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033474.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号