Проблема с scikit-learn и случайным лесом! Выдает такую ошибку: IndexError: Item wrong length 67 instead of 68

Вот код:

import pandas as pd 
import numpy as np
import seaborn as sns
%matplotlib inline
import matplotlib.pyplot as plt
Porphs_data = pd.read_excel('G:\\Porphyrins\\Selected-Descs1.xlsx', index_col=0)
# Create correlation matrix
corr_matrix = Porphs_data.corr().abs()
# Select upper triangle of correlation matrix
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))
# Find index of feature columns with correlation greater than 0.95
to_drop = [column for column in upper.columns if any(upper[column] > 0.95)]
# Drop features 
Porphs_data1 = Porphs_data.drop(Porphs_data[to_drop], axis=1)
y = Porphs_data1.Fi
X = Porphs_data1.drop(['Fi'], axis=1)
X_train = X.drop(["(p-Br)4-TPP", "5,15-NO2-etioporphyrin I", "Deuteroporphyrin-IX-DME", "N-CH3-Octaethylporphyrin", "Porphine", "Zn-Octaethylporphyrin"], axis=0)
y_train = y.drop(["(p-Br)4-TPP", "5,15-NO2-etioporphyrin I", "Deuteroporphyrin-IX-DME", "N-CH3-Octaethylporphyrin", "Porphine", "Zn-Octaethylporphyrin"], axis=0)
X_test = X.loc[["(p-Br)4-TPP", "5,15-NO2-etioporphyrin I", "Deuteroporphyrin-IX-DME", "N-CH3-Octaethylporphyrin", "Porphine", "Zn-Octaethylporphyrin"]]
y_test = y.loc[["(p-Br)4-TPP", "5,15-NO2-etioporphyrin I", "Deuteroporphyrin-IX-DME", "N-CH3-Octaethylporphyrin", "Porphine", "Zn-Octaethylporphyrin"]]
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_selection import SelectFromModel
randomforest = RandomForestRegressor(n_jobs=-1)
selector = SelectFromModel(randomforest)
features_important = selector.fit_transform(X_train, y_train)
model = randomforest.fit(features_important, y_train)
from sklearn.model_selection import GridSearchCV
clf_rf = RandomForestRegressor()
parameters = {"n_estimators":[1, 2, 3, 4, 5, 7, 10, 15, 20, 30, 40, 50, 100], "max_depth":[1, 2, 3, 4, 5, 7, 10, 15, 20, 30, 40, 50, 100]}
grid_search_cv_clf = GridSearchCV(clf_rf, parameters, cv=5)
grid_search_cv_clf.fit(features_important, y_train)
from sklearn.metrics import r2_score
y_pred = grid_search_cv_clf.predict(features_important)
r2_score(y_train, y_pred)
grid_search_cv_clf.best_params_
best_clf = grid_search_cv_clf.best_estimator_

Проблемы начинаются здесь:

X_test_filtered = X_test.iloc[:,selector.get_support()]
best_clf.score(X_test_filtered, y_test)

Выдает следующую ошибку: IndexError: Item wrong length 67 instead of 68. По-видимому, 68 - это число дескрипторов (фичей). Но что означает сообщение об ошибке? Я писал этот код достаточно давно, и уже забыл что тут к чему. Пожалуйста, помогите исправить код.


Ответы (1 шт):

Автор решения: CrazyElf

Полагаю, что надо сделать как-то так:

X_test_filtered = X_test.iloc[:,selector.get_support()]
y_test_filtered = y_test.iloc[:,selector.get_support()]
best_clf.score(X_test_filtered, y_test_filtered)

Проблема в том, что вы берёте матрицу и массив с одинаковым количеством строк, а потом выкидываете из матрицы некоторые строки. И потом пытаетесь получить скор модели. Конечно, у модели не сходиться при этом количество строк в матрице и количество элементов в векторе с таргетом.

P.S. При этом я не понимаю, что находится в selector.get_support(), и не знаю, зачем вы берёте такой срез, но заработать это должно.

→ Ссылка