Python Keras搭建模型拟合数据集报错问题咨询
问题描述
在将数据集拟合到构建的神经网络模型过程中遇到报错,无法理解报错含义,也不知道对应修复方法。
相关代码
import numpy as np import pandas as pd from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler from keras.models import Sequential from keras.layers import Dense dataset = pd.read_csv('Churn_Modelling.csv') dataset
数据集预览

X=dataset.iloc[:,3:13].values Y=dataset.iloc[:,13].values from sklearn.preprocessing import LabelEncoder, OneHotEncoder lableencoder_X_2 = LabelEncoder() X[:, 2] = lableencoder_X_2.fit_transform(X[:, 2]) ct = ColumnTransformer([('ohe', OneHotEncoder(), [1])], remainder='passthrough') X = np.array(ct.fit_transform(X), dtype = str) X = X[:, 1:] classifier.add(Dense(units = 6,kernel_initializer = 'uniform',activation ='relu',input_dim = 11)) classifier.add(Dense(units = 6,kernel_initializer = 'uniform',activation ='relu')) classifier.add(Dense(units= 1, kernel_initializer = 'uniform',activation = 'sigmoid')) classifier.compile(optimizer = 'adam', loss = 'binary_crssentropy', metrics = ['accuracy']) # 拟合数据集到模型 classifier.fit(X_train, y_train, batch_size = 10, epochs = 100)
报错信息

报错原因与修复方案
代码中存在5处直接触发报错或导致模型无法正常训练的问题,对应修复方式如下:
- 未初始化序贯模型:代码未实例化
Sequential类就直接调用classifier.add()添加网络层,会触发变量未定义报错。需要在添加网络层前先执行classifier = Sequential()完成模型初始化。 - 特征类型错误:独热编码后执行
X = np.array(ct.fit_transform(X), dtype = str)强制将所有特征转为字符串格式,神经网络无法接收字符串类型的张量参与运算,需要删除dtype = str参数,保留默认数值类型即可。 - 损失函数拼写错误:编译模型时传入的损失值
binary_crssentropy存在拼写错误,Keras无法识别该损失函数,正确的二分类交叉熵损失名称为binary_crossentropy。 - 缺少数据集拆分步骤:代码直接调用
classifier.fit(X_train, y_train),但从未定义X_train、y_train变量,需要先通过train_test_split将处理好的特征和标签拆分为训练集、测试集。 - 未做特征标准化:代码导入了
StandardScaler但未使用,神经网络对特征尺度敏感,未缩放的特征会导致模型收敛慢、精度差,需要在数据集拆分后对特征做标准化处理。
修正后可运行完整代码
import numpy as np import pandas as pd from sklearn.compose import ColumnTransformer from sklearn.preprocessing import LabelEncoder, OneHotEncoder, StandardScaler from sklearn.model_selection import train_test_split from keras.models import Sequential from keras.layers import Dense # 读取数据集 dataset = pd.read_csv('Churn_Modelling.csv') X = dataset.iloc[:,3:13].values Y = dataset.iloc[:,13].values # 分类字段编码 labelencoder_X_2 = LabelEncoder() X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2]) ct = ColumnTransformer([('ohe', OneHotEncoder(), [1])], remainder='passthrough') X = np.array(ct.fit_transform(X)) X = X[:, 1:] # 去除独热编码产生的冗余哑变量 # 拆分训练集、测试集 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=0) # 特征标准化 sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # 初始化并构建神经网络 classifier = Sequential() classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation='relu', input_dim = 11)) classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation='relu')) classifier.add(Dense(units= 1, kernel_initializer = 'uniform', activation='sigmoid')) # 编译模型 classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) # 训练模型 classifier.fit(X_train, y_train, batch_size = 10, epochs = 100)
内容的提问来源于stack exchange,提问作者LidorTubul
相关产品推荐
相关产品推荐

