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('<U32'),)

成功的代码:

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 **”有指明该数据有多少个标签(类别)哦,不要像我刚开始一样傻傻的去数~👻
害,就先这样吧,今天大部分时间都来搞这个了,我丢。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值