Python构建糖尿病预测ANN时遇数据转换与模型警告问题求助
基于糖尿病数据集的ANN预测代码问题解析
我正在用Python构建人工神经网络(ANN),基于糖尿病数据集做预测,但遇到了几个错误和警告,具体如下:
完整代码
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, KFold, cross_val_score from sklearn import preprocessing from keras import Sequential from keras.layers import Dense from sklearn.metrics import confusion_matrix, accuracy_score data = pd.read_csv('C:/Users/<<>>/Downloads/Dataset of Diabetes.csv') # drop irrelevant columns dropcols = ['ID', 'No_Pation'] data = data.drop(dropcols, axis=1) data.info() X = data.values Y = data['CLASS'].values label_encoder = preprocessing.LabelEncoder() data['CLASS'] = label_encoder.fit_transform(data['CLASS']) data['Gender'] = label_encoder.fit_transform(data['Gender']) data['CLASS'].unique() data['Gender'].unique() data.info() X = np.delete(X, 1, axis=1) X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=42) X_train = np.asarray(X_train).astype(np.float32) Y_train = np.asarray(Y_train).astype(np.float32) classifier = Sequential() classifier.add(Dense(units=10, activation='relu', input_dim=X.shape[1])) classifier.add(Dense(units=10, activation='relu')) classifier.add(Dense(units=1, activation='sigmoid')) classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) classifier.fit(X_train, Y_train, epochs=100, batch_size=10) Y_pred = classifier.predict(X_test) Y_pred_int = (Y_pred > 0.5).astype(int) cm = confusion_matrix(Y_test, Y_pred_int) acc = accuracy_score(Y_test, Y_pred_int) print("Accuracy:", acc) print("Confusion Matrix:\n", cm)
数据信息(最后一行data.info()输出)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1000 entries, 0 to 999 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Gender 1000 non-null int32 1 AGE 1000 non-null int64 2 Urea 1000 non-null float64 3 Cr 1000 non-null int64 4 HbA1c 1000 non-null float64 5 Chol 1000 non-null float64 6 TG 1000 non-null float64 7 HDL 1000 non-null float64 8 LDL 1000 non-null float64 9 VLDL 1000 non-null float64 10 BMI 1000 non-null float64 11 CLASS 1000 non-null int32 dtypes: float64(8), int32(2), int64(2) memory usage: 86.1 KB
遇到的错误与警告
错误1:字符串转浮点失败
Traceback (most recent call last): File "C:\Users\<<>>\PycharmProjects\AI2\NeuralNetwork.py", line 32, in <module> X_train = np.asarray(X_train).astype(np.float32) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ValueError: could not convert string to float: 'M'
警告信息
UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead. super().__init__(activity_regularizer=activity_regularizer, **kwargs)
错误2:NumPy数组转Tensor失败
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float)
问题解析与解决
1. 字符串转浮点错误的修复
- 原因:先提取了
X = data.values,之后才对data['Gender']做标签编码,导致X中仍保留原始字符串类型(如'M'),转float时失败。 - 修复:先完成所有特征编码,再提取特征矩阵和标签:
# 先执行标签编码 label_encoder = preprocessing.LabelEncoder() data['CLASS'] = label_encoder.fit_transform(data['CLASS']) data['Gender'] = label_encoder.fit_transform(data['Gender']) # 再提取X和Y X = data.drop('CLASS', axis=1).values Y = data['CLASS'].values - 注意:
X = np.delete(X, 1, axis=1)会删除AGE列,若无意删除建议移除该行。
2. Input_dim警告的处理
- 含义:Keras新版本推荐在Sequential模型中用
Input(shape)层作为输入层,替代在Dense层设置input_dim的写法,更符合现代API规范。 - 修复写法:
from keras.layers import Input classifier = Sequential() classifier.add(Input(shape=(X.shape[1],))) # 替换原input_dim参数 classifier.add(Dense(units=10, activation='relu')) classifier.add(Dense(units=10, activation='relu')) classifier.add(Dense(units=1, activation='sigmoid'))
3. NumPy数组转Tensor错误的解决
- 原因:数组混合不同数据类型,或标签
Y类型不匹配。 - 修复:
- 通过第一步预处理确保
X和Y为纯数值类型; - 统一标签类型,二分类任务下确保
Y为0/1的整数或浮点型:Y_train = Y_train.astype(np.int32)
- 通过第一步预处理确保
其他代码问题指出
- 特征标准化:ANN对特征尺度敏感,建议拆分数据集后对特征做标准化:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) - 标签分类匹配:若
CLASS是多分类,需将损失函数改为loss='categorical_crossentropy',并调整输出层激活函数和单元数; - 交叉验证未使用:导入了
KFold和cross_val_score但未使用,若需评估模型稳定性可添加交叉验证逻辑。
内容的提问来源于stack exchange,提问作者nyura45
相关产品推荐
相关产品推荐

