运行SVR模型时出现了pandas.errors.IndexingError的报错,最后的解决方法

这个是当时出现的报错
Traceback (most recent call last):
  File "E:\ANACODNA\Lib\site-packages\IPython\core\interactiveshell.py", line 3526, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "C:\Users\psq\AppData\Local\Temp\ipykernel_28648\654163054.py", line 85, in <module>
    Ytrain = Ytrain.iloc[:,0].ravel()
             ~~~~~~~~~~~^^^^^
  File "E:\ANACODNA\Lib\site-packages\pandas\core\indexing.py", line 1097, in __getitem__
    # we should be able to match up the dimensionality here
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\pandas\core\indexing.py", line 1594, in _getitem_tuple
    elif isinstance(key, tuple):
          ^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\pandas\core\indexing.py", line 900, in _validate_tuple_indexer
  File "E:\ANACODNA\Lib\site-packages\pandas\core\indexing.py", line 939, in _validate_key_length
    If a tuple key includes an Ellipsis, replace it with an appropriate
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pandas.errors.IndexingError: Too many indexers

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:\ANACODNA\Lib\site-packages\IPython\core\interactiveshell.py", line 2120, in showtraceback
    stb = self.InteractiveTB.structured_traceback(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\IPython\core\ultratb.py", line 1435, in structured_traceback
    return FormattedTB.structured_traceback(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\IPython\core\ultratb.py", line 1326, in structured_traceback
    return VerboseTB.structured_traceback(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\IPython\core\ultratb.py", line 1173, in structured_traceback
    formatted_exception = self.format_exception_as_a_whole(etype, evalue, etb, number_of_lines_of_context,
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\IPython\core\ultratb.py", line 1088, in format_exception_as_a_whole
    frames.append(self.format_record(record))
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\IPython\core\ultratb.py", line 970, in format_record
    frame_info.lines, Colors, self.has_colors, lvals
    ^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\IPython\core\ultratb.py", line 792, in lines
    return self._sd.lines
           ^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\stack_data\utils.py", line 145, in cached_property_wrapper
    value = obj.__dict__[self.func.__name__] = self.func(obj)
                                               ^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\stack_data\core.py", line 698, in lines
    pieces = self.included_pieces
             ^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\stack_data\utils.py", line 145, in cached_property_wrapper
    value = obj.__dict__[self.func.__name__] = self.func(obj)
                                               ^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\stack_data\core.py", line 649, in included_pieces
    pos = scope_pieces.index(self.executing_piece)
                             ^^^^^^^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\stack_data\utils.py", line 145, in cached_property_wrapper
    value = obj.__dict__[self.func.__name__] = self.func(obj)
                                               ^^^^^^^^^^^^^^
  File "E:\ANACODNA\Lib\site-packages\stack_data\core.py", line 628, in executing_piece
    return only(
           ^^^^^
  File "E:\ANACODNA\Lib\site-packages\executing\executing.py", line 164, in only
    raise NotOneValueFound('Expected one value, found 0')
executing.executing.NotOneValueFound: Expected one value, found 0

可以看出主要是pandas.errors.IndexingError: Too many indexers的问题

这个是我出问题的代码

Ytrain = Ytrain.iloc[:,0].ravel()
Ytest = Ytest.iloc[:,0].ravel()

我用Print(type(Ytrain))发现它的类型是Series(Ytest同样),这里需要将它的类型转变为DataFrame才可以

于是我用下面两行代码解决了这个问题

Ytrain = Ytrain.to_frame()
Ytest = Ytest.to_frame()

其实前面分割数据集时Xtrain和Xtest都是DataFrame,但是Y这边就变成Series了

``` import os import numpy as np import pandas as pd from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import MinMaxScaler from sklearn.svm import SVR from sklearn.metrics import mean_squared_error, r2_score def process_single_file(file_path, output_dir, features, target_column): try: # 读取数据 df = pd.read_excel(file_path) df.columns = df.columns.str.strip() # 提取特征和目标 X = df[features] y = df[target_column] # 分割数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 特征归一化 scaler_X = MinMaxScaler() X_train_scaled = scaler_X.fit_transform(X_train) X_test_scaled = scaler_X.transform(X_test) # 目标归一化 scaler_y = MinMaxScaler() y_train_scaled = scaler_y.fit_transform(y.values.reshape(-1, 1)).flatten() y_test_scaled = scaler_y.transform(y_test.values.reshape(-1, 1)).flatten() # 参数网格 param_grid = { 'kernel': ['rbf', 'poly'], 'C': np.logspace(-2, 3, 6), 'gamma': np.logspace(-4, 0, 5), 'epsilon': [0.05, 0.1, 0.2], 'degree': [2, 3] } # 建模与调参 svr = SVR(max_iter=10000, tol=1e-4) grid_search = GridSearchCV(svr, param_grid, cv=5, scoring='neg_mean_squared_error', verbose=0) grid_search.fit(X_train_scaled, y_train_scaled) # 最佳模型预测 best_svr = grid_search.best_estimator_ y_test_pred = best_svr.predict(X_test_scaled) y_test_pred_original = scaler_y.inverse_transform(y_test_pred.reshape(-1, 1)).flatten() # 计算指标 mse = mean_squared_error(y_test, y_test_pred_original) rmse = np.sqrt(mse) r2 = r2_score(y_test, y_test_pred_original) # 创建结果DataFrame file_name = os.path.basename(file_path) results = pd.DataFrame({ '文件名': [file_name], '最佳参数': [str(grid_search.best_params_)], '测试集MSE': [mse], '测试集RMSE': [rmse], '测试集R²': [r2] }) # 保存单独结果 output_path = os.path.join(output_dir, f"{os.path.splitext(file_name)[0]}_结果.xlsx") os.makedirs(os.path.dirname(output_path), exist_ok=True) results.to_excel(output_path, index=False) return results except Exception as e: print(f"处理文件 {file_path} 出错: {str(e)}") return None # 配置参数 INPUT_DIR = "microalgae" # 原始文件存放目录 OUTPUT_DIR = "SVR结果" # 结果输出目录 SUMMARY_FILE = "SVR模型汇总结果.xlsx" # 汇总文件名 FEATURES = ['T', 'Ph', 'Biomass', 'Time', 'Initial'] # 特征列 TARGET = 'Removel' # 目标列 # 获取所有Excel文件 all_files = [os.path.join(INPUT_DIR, f) for f in os.listdir(INPUT_DIR) if f.endswith('.xlsx') or f.endswith('.xls')] # 处理所有文件并汇总结果 all_results = [] for file in all_files: print(f"正在处理文件: {file}") result = process_single_file(file, OUTPUT_DIR, FEATURES, TARGET) if result is not None: all_results.append(result) # 合并结果并保存 if all_results: summary_df = pd.concat(all_results, ignore_index=True) summary_df.to_excel(os.path.join(OUTPUT_DIR, SUMMARY_FILE), index=False) print(f"处理完成!共处理 {len(all_results)} 个文件,汇总结果已保存。") else: print("没有成功处理任何文件。")```代码出现Found input variables with inconsistent numbers of samples
最新发布
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值