我目前正在处理一个关于客户流失管理的二分类问题。
在拟合模型时遇到了一个错误。似乎是输入/输出中的某些问题导致了这个错误,但我一直没能找出具体原因。
以下是我的代码(df包含我从中创建向量的数据框):
#删除不重要的列del df['RowNumber']del df['CustomerId']del df['Surname']
然后,我需要转换两个分类变量:
#转换并为分类变量创建虚拟变量df["Gender"] = df["Gender"].astype('category')df["Geography"] = df["Geography"].astype('category')df['Gender'] = pd.get_dummies(df['Gender'])df['Geography'] = pd.get_dummies(df['Geography'])y = df.iloc[:, -1] #标签变量X = df.iloc[:, :10] #特征
将数据集拆分为测试集和训练集:
# 将数据集拆分为训练集和测试集from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
接下来,我对变量进行缩放处理:
from sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)print(X_train.shape) #(8000, 10)print(X_test.shape) #(2000, 10)print(y_train.shape)#(8000,)print(y_test.shape)#(2000,)
构建网络:
model = models.Sequential()model.add(layers.Dense(32, activation='relu', input_shape=(8000,)))model.add(layers.Dense(1, activation='sigmoid'))# 编译神经网络model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])#拟合我们的模型model.fit(X_train, y_train, batch_size = 10, epochs = 10)# 预测测试集结果y_pred = classifier.predict(X_test)y_pred = (y_pred > 0.5)# 创建混淆矩阵from sklearn.metrics import confusion_matrixcm = confusion_matrix(y_test, y_pred)
我遇到的具体错误代码是:
ValueError: Error when checking input: expected dense_47_input to have shape (None, 8) but got array with shape (8000, 10)
如果能得到解决这个问题的帮助,将不胜感激!
编辑:model.summary在model.compile之前:
回答:
我想你需要修改这部分:
model.add(layers.Dense(32, activation='relu', input_shape=(10,)))
10 是你使用的特征数量。Keras 会自动处理批次/数据集中的行数。
编辑说明:
from keras import modelsfrom keras import layersmodel = models.Sequential()model.add(layers.Dense(32, input_shape=(10,)))model.add(layers.Dense(1))
在这里,第一个层被创建,它将只接受一个维度为10的2D张量(零维度,即批次维度,是未指定的,因此可以接受任何值)。
因此,这个层只能连接到一个上游层,该层期望其输入为32维向量。在使用Keras时,你不必担心兼容性,因为你添加到模型中的层会动态构建以匹配传入层的形状。
第二个层没有接收到输入形状参数——它自动推断其输入形状为之前层的输出形状。
解码模型中的参数值:
假设这是我的模型:
from keras import modelsfrom keras import layersmodel = models.Sequential()model.add(layers.Dense(32, input_shape=(2,)))model.add(layers.Dense(1))model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])print model.summary()
这是模型摘要:
_________________________________________________________________Layer (type) Output Shape Param #=================================================================dense_1 (Dense) (None, 32) 96_________________________________________________________________dense_2 (Dense) (None, 1) 33=================================================================Total params: 129Trainable params: 129Non-trainable params: 0_________________________________________________________________
对于Dense层,我们需要计算这个:
output = dot(W, input) + b
或者
output = relu(dot(W, input) + b) #这里的relu是激活函数
在这个表达式中,W和b是层的张量属性。它们被称为层的“权重”或“可训练参数”(分别是内核和偏置属性)。这些权重包含网络从训练数据中学习到的信息。
对于第一层(参数=96)= 隐藏单元数 * 输入数据维度 + 偏置值
96 = 32 (隐藏单元) * 2 (数据维度) + 32 (偏置值与隐藏单元数相同)
对于第二层(参数=33)= 隐藏单元数 * 数据维度 + 偏置值
33 = 1 (隐藏单元) * 32 (数据维度) + 1 (偏置值与隐藏单元数相同)总参数 = 96+33 = 129
希望这对你有帮助 🙂
说明来源: Keras 文档