本人也在初学阶段,将自己遇到的一些小问题记录如下,如果有误欢迎大佬们评论指正Orz Orz Orz
train_y = pd.read_csv('datalab/470000/train_y.csv')
此处获得的train_y数据为包含列索引和行索引,类似一个excel表格的DataFrame类型数据,并非numpy类型数据,因此此时是无法进行reshape等常规操作的,因此需要用
train_y=train_y.values
将其中的数据取出变为数组,官方对于values的解释如下:
官方样例如下:
参考博文: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)
如果是一维数据的训练,需要将其改变形状,比如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处理。
对训练数据进行统计时需要用到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)