如何在Scikit-learn的MLPRegressor中适配二维特征
问题描述
创建了如下pandas DataFrame:
ModelCFL = pd.DataFrame(columns=['data_case', 'length'])
随后用CSV文件填充该DataFrame:
cases = ['0', '250'] for i in range(0, len(cases)): cases_data = pd.read_csv(cases[i] + '.csv', header=0, delimiter=";") cases_data.dropna(inplace=True) parser_data = cases_data['current'].tolist() ModelCFL.at[i, 'data_case'] = parser_data ModelCFL.at[i, 'length'] = cases[i]
接着生成X和Y变量:
X = ModelCFL.loc[:, 'data_case'].to_list() Y = ModelCFL.loc[:, 'length'].to_list()
运行以下代码时:
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, random_state=1) CFL_ANN = MLPRegressor(max_iter=300, activation="relu", hidden_layer_sizes=(25, 25)) CFL_ANN.fit(Xtrain, Ytrain) CFL_ANN_predict = CFL_ANN.predict(Xtest)
出现错误:
ValueError: could not convert string to float: '300,300,300'
问题核心:变量应为二维数值列表特征,但当前无法被解析为浮点数,需让MLPRegressor正确识别该特征。
解决方法
1. 正确解析current列为数值列表
错误根源是CSV中current列的内容是逗号分隔的字符串(如'300,300,300'),直接tolist()得到的是字符串列表而非数值列表。需要将每个字符串分割并转换为浮点数:
cases = ['0', '250'] for i in range(0, len(cases)): cases_data = pd.read_csv(cases[i] + '.csv', header=0, delimiter=";") cases_data.dropna(inplace=True) # 将每个current字符串按逗号分割并转成浮点数列表 parser_data = cases_data['current'].apply(lambda x: [float(num) for num in x.split(',')]).tolist() ModelCFL.at[i, 'data_case'] = parser_data ModelCFL.at[i, 'length'] = cases[i]
2. 将X转换为MLP要求的二维数组格式
MLPRegressor的输入需要是**形状为(样本数, 特征数)**的二维数组,需把每个样本的数值列表转成一维数组,再组合成二维数组:
import numpy as np # 转换为二维数组 X = np.array(ModelCFL['data_case'].tolist())
3. 将Y转换为数值类型
length当前是字符串类型('0'、'250'),回归任务需要数值类型,需转换为整数或浮点数:
Y = ModelCFL['length'].astype(int).tolist()
修改后的完整训练代码
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, random_state=1) CFL_ANN = MLPRegressor(max_iter=300, activation="relu", hidden_layer_sizes=(25, 25)) CFL_ANN.fit(Xtrain, Ytrain) CFL_ANN_predict = CFL_ANN.predict(Xtest)
内容的提问来源于stack exchange,提问作者Felipe Quintero Suárez
相关产品推荐
相关产品推荐

