深度学习数据预处理的一些问题

本人也在初学阶段,将自己遇到的一些小问题记录如下,如果有误欢迎大佬们评论指正Orz Orz Orz

1.csv读取

train_y = pd.read_csv('datalab/470000/train_y.csv')

此处获得的train_y数据为包含列索引和行索引,类似一个excel表格的DataFrame类型数据,并非numpy类型数据,因此此时是无法进行reshape等常规操作的,因此需要用

train_y=train_y.values

将其中的数据取出变为数组,官方对于values的解释如下:

深度学习数据预处理的一些问题_第1张图片

官方样例如下:

深度学习数据预处理的一些问题_第2张图片

2.训练标签字母转数值

参考博文:https://blog.csdn.net/qq_34467412/article/details/84587897

训练数据标签如果非常规数字,无法使用to_categorical函数将其变为one-hot类型数据标签,比如在对ECG信号处理时,训练数据标签为N、S、V、F、Q几个字符,因此在早期使用了下列代码进行处理

from keras.utils import to_categorical
for i in range(0,Y_train.shape[0]):
    if(Y_train[i]=='N'):
        Y_train[i]=0;
    if(Y_train[i]=='S'):
        Y_train[i]=1;
    if(Y_train[i]=='V'):
        Y_train[i]=2;
    if(Y_train[i]=='F'):
        Y_train[i]=3;
    if(Y_train[i]=='Q'):
        Y_train[i]=4;        
Y_train = keras.utils.to_categorical(Y_train, 5) 
for i in range(0,Y_test.shape[0]):
    if(Y_test[i]=='N'):
        Y_test[i]=0;
    if(Y_test[i]=='S'):
        Y_test[i]=1;
    if(Y_test[i]=='V'):
        Y_test[i]=2;
    if(Y_test[i]=='F'):
        Y_test[i]=3;
    if(Y_test[i]=='Q'):
        Y_test[i]=4;        
Y_test = keras.utils.to_categorical(Y_test, 5) 

后来发现有可用的函数可以直接将标签字母转化为数字,方便之后的one-hot处理

from sklearn.preprocessing import LabelEncoder    #用于Label编码
from sklearn.preprocessing import OneHotEncoder     #用于one-hot编码
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
values = np.array(data)


lf=LabelEncoder().fit(values)
data_label=lf.transform(values)
print(data_label)

或者

data_label = LabelEncoder().fit_transform(values)

out:  array([0, 0, 2, 0, 1, 1, 2, 0, 2, 1], dtype=int64)

注意:此函数要求输入的数组为“一行”,因此需要对train_y进行降维处理,之后要再对变换后的数据升维,再进行one-hot处理,如下所示:

label = LabelEncoder().fit_transform(train_y.values.ravel())#在将字符转化为数字前需要扁平化
train_y = np.expand_dims(label, axis=1)#将扁平化的后的数组恢复
train_y = keras.utils.to_categorical(train_y, 5) 

3.训练数据的形状

如果是一维数据的训练,需要将其改变形状,比如10000个长度为300的数组,原本的数据形状为(10000,300),如果用1D-CNN训练,需要将其转化为(10000,300,1)

X_test=X_test.values
X_train=X_train.reshape((X_train.shape[0],X_train.shape[1],1))#转化为numpy类型后才可以进行reshape操作

同样要注意如果x_train来自pd.csv函数,同样要先获得values才能进行reshape处理。

4.训练数据统计

对训练数据进行统计时需要用到value_count函数统计不同数字标签出现的次数,但是我在使用过程中遇到如下问题

'numpy.ndarray' object has no attribute 'value_counts'

这就又回到数据类型的问题,前边说到从csv中直接读取的属于DataFrame类型,本质上仍是一个“表格”,而value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。

因此在对转化为数值的标签数据进行统计时需要先对其数字化(数字化时已经取出values然后扁平化降维),然后将一维的数据变为Series类型,因为value_counts()是Series拥有的方法,一般在DataFrame中使用时,需要指定对哪一列或行使用。所以处理如下:

#先将其数值化,此时train_y为DataFrame类型
train_y = LabelEncoder().fit_transform(train_y.values.ravel())
#之后train_y已经为numpy.ndarray类型
#注意升维降维函数是对np.array进行处理,因此需要先取values,在上文已经提到

#因为数值化时已经降维,所以再变为Series类型
train_df=pd.Series(train_y)#函数只能对一维数据进行处理
#使用value_counts()统计
equilibre=train_df.value_counts()
print(equilibre)
#之后根据模型需要再将train_y升维
train_y = np.expand_dims(train_y, axis=1)

 

你可能感兴趣的:(深度学习)