You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型不匹配。
  • 修复:
    1. 通过第一步预处理确保X和Y为纯数值类型;
    2. 统一标签类型,二分类任务下确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:19:55