文章目录
一个小坑
Python读入csv数据,y有着一列有缺失值,前期将缺失值写为nan,读进Python之后被正确识别为缺失值,但是拟合深度学习模型时报错。
处理思路:y缺失的样本不可用,直接取原数据集的子集,运行模型。
代码如下:
import pandas as pd
df = pd.read_csv('/Users/zi/Desktop/data_all.csv')
df_test = pd.read_csv('/Users/zi/Desktop/data_test.csv')
p=5 #协变量维数
df['y'] = df['y'].fillna(-1) #将有缺失的列填补为-1(因为这里未缺失数据为0和1,故不会混淆)
#对x进行标准化
X_train = df.iloc[:,0:p]
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_train = X_train.values #转化为array形式
#注意:要用训练集的结果来标准化测试集
X_test = df_test.iloc[:, 0:p]
X_test = scaler.transform(X_test)
X_test = X_test.values
#取训练数据因变量未缺失的子集
Y_train = df.iloc[0:trainsize,5]
Y_train = Y_train.values
index_for_null = Y_train != -1
X_train = X_train[index_for_null,] #注意DataFrame格式的数据和np.array取子集代码略有不同,无需在逗号后加 :
Y_train = Y_train[index_for_null,]
#训练模型
model = models.Sequential()
model.add(layers.Dense(40, activation='relu', input_shape=(p+1,)))
for h in range(5):
model.add(layers.Dense(40, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy']) # 等价于metrics =[metircs.binary_accuracy]
model.fit(X_train, Y_train, batch_size=10, epochs=30)
# 测试集结果预测
result1 = model.predict_classes(X_test)
result2 = model.predict(X_test)
# 将测试集上的误差也写入EXCEL
accu_result = model.evaluate(X_train, Y_train, batch_size=100)
error_train = accu_result[1]