Позволяет взять набор данных boston, доступный в from sklearn.datasets import load_boston
boston = load_boston()
X = pd.DataFrame(boston["data"])
0 1 2 3 4 5 6 7 8 9 10 11 12
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33
5 0.02985 0.0 2.18 0.0 0.458 6.430 58.7 6.0622 3.0 222.0 18.7 394.12 5.21
6 0.08829 12.5 7.87 0.0 0.524 6.012 66.6 5.5605 5.0 311.0 15.2 395.60 12.43
Я создал модель машинного обучения (RF) и получил все оценки в модели.
estimators = model.estimators_
Вы можете подумать, что у этого есть список функций, которые берут данные уровня строки и возвращают значение.
>> estimators = model.estimators_
>> estimators
[DecisionTreeRegressor(criterion='mse', max_depth=60, max_features=8,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=5,
min_samples_split=12, min_weight_fraction_leaf=0.0,
presort=False, random_state=1838148368, splitter='best'), DecisionTreeRegressor(criterion='mse', max_depth=60, max_features=8,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=5,
min_samples_split=12, min_weight_fraction_leaf=0.0,
presort=False, random_state=1754873550, splitter='best'), DecisionTreeRegressor(criterion='mse', max_depth=60, max_features=8,
max_leaf_nodes=None, min_impurity_decrease=0.0,....]
Я хочу, чтобы каждая оценка/функция в списке применялась к каждой строке в кадре данных.
Если я не конвертирую данные в кадр данных, boston['data']
возвращает 2D-массив. Я могу использовать два for loops
для выполнения выше. Предположим, что X является двумерным массивом, после чего я могу сделать следующее
for x in range(len(X)):
vals = []
for estimator in model.estimators_:
vals.append(estimator.predict(X[x])[0])
Я не хочу использовать параметр 2D-массива, потому что хочу сохранить индексную информацию DataFrame для будущих операций.
В последней версии pandas
df.agg
должен быть в состоянии сделать именно это.
К сожалению, для текущей версии она кажется нарушенной, когда axis=1
: https://github.com/pandas-dev/pandas/issues/16679
Здесь хакерский путь вокруг него:
X.T.agg(estimators).T
estimators
равен 1000, а DF - 100 000 строк.estimators
на срезы меньшей длины, затем получать результат для каждого среза и объединять результаты вместе, используяpd.merge
в индексе.