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