ANN医保成本预测项目中DataFrame无concat属性错误求助
医保数据集ANN成本预测模型参数调优代码错误排查
问题描述
我正在开展一项基于医保数据集的ANN(人工神经网络)成本预测模型项目,编写了用于寻找最优batch_size和epochs参数的代码,但运行时出现错误:
AttributeError: 'DataFrame' object has no attribute 'concat'
尝试过append()和concat()方法都没解决,需要排查问题。
原代码
def FunctionFindBestParams(X_train, y_train, X_test, y_test): batch_size_list=[5, 10, 15, 20] epoch_list = [5, 10, 50, 100] import pandas as pd SearchResultsData=pd.DataFrame(columns=['TrialNumber', 'Parameters', 'Accuracy']) TrialNumber=0 for batch_size_trial in batch_size_list: for epochs_trial in epoch_list: TrialNumber+=1 model = Sequential() model.add(Dense(units=5, input_dim=X_train.shape[1], kernel_initializer='normal', activation='relu')) model.add(Dense(units=5, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(X_train, y_train ,batch_size = batch_size_trial, epochs = epochs_trial, verbose=0) MAPE = np.mean(100 * (np.abs(y_test-model.predict(X_test))/y_test)) print(TrialNumber, 'Parameters:','batch_size:', batch_size_trial,'-', 'epochs:',epochs_trial, 'Accuracy:', 100-MAPE) SearchResultsData=SearchResultsData.concat(pd.DataFrame(data=[[TrialNumber, str(batch_size_trial)+'-'+str(epochs_trial), 100-MAPE]], columns=['TrialNumber', 'Parameters', 'Accuracy'] )) return(SearchResultsData) ResultsData=FunctionFindBestParams(X_train, y_train, X_test, y_test)
错误原因分析
concat()是pandas库的顶层函数,并非DataFrame对象的实例方法,你错误地调用了SearchResultsData.concat(...),这是导致报错的直接原因。- 另外,旧版pandas中的
DataFrame.append()方法已被弃用,即便使用也会抛出警告,且不符合当前pandas的最佳实践。
修复后的代码
def FunctionFindBestParams(X_train, y_train, X_test, y_test): batch_size_list=[5, 10, 15, 20] epoch_list = [5, 10, 50, 100] import pandas as pd import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense SearchResultsData=pd.DataFrame(columns=['TrialNumber', 'Parameters', 'Accuracy']) TrialNumber=0 for batch_size_trial in batch_size_list: for epochs_trial in epoch_list: TrialNumber+=1 model = Sequential() model.add(Dense(units=5, input_dim=X_train.shape[1], kernel_initializer='normal', activation='relu')) model.add(Dense(units=5, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(X_train, y_train ,batch_size = batch_size_trial, epochs = epochs_trial, verbose=0) # 减少冗余日志输出 y_pred = model.predict(X_test, verbose=0) MAPE = np.mean(100 * (np.abs(y_test - y_pred)/y_test)) print(TrialNumber, 'Parameters:','batch_size:', batch_size_trial,'-', 'epochs:',epochs_trial, 'Accuracy:', 100-MAPE) # 修复concat调用方式,添加索引重置避免重复 new_row = pd.DataFrame( data=[[TrialNumber, f"{batch_size_trial}-{epochs_trial}", 100-MAPE]], columns=['TrialNumber', 'Parameters', 'Accuracy'] ) SearchResultsData = pd.concat([SearchResultsData, new_row], ignore_index=True) return SearchResultsData ResultsData=FunctionFindBestParams(X_train, y_train, X_test, y_test)
额外优化说明
- 补充了缺失的导入语句(
numpy、keras相关模块),避免运行时出现导入错误 - 将模型预测结果存入变量
y_pred,代码逻辑更清晰 - 使用
f-string格式化参数字符串,可读性更强 - 在
pd.concat中添加ignore_index=True,避免循环中出现索引重复问题
内容的提问来源于stack exchange,提问作者Nike Cage 675
相关产品推荐
相关产品推荐

