Панды применяют список функций к фрейму данных

1

Позволяет взять набор данных 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
dataframe
scikit-learn

1 ответ

2

В последней версии pandas df.agg должен быть в состоянии сделать именно это.

К сожалению, для текущей версии она кажется нарушенной, когда axis=1: https://github.com/pandas-dev/pandas/issues/16679

Здесь хакерский путь вокруг него:

X.T.agg(estimators).T
  • 0
    чтобы распараллелить этот процесс, представьте, что массив estimators равен 1000, а DF - 100 000 строк.
  • 0
    Несомненно, очевидным способом было бы разрезать estimators на срезы меньшей длины, затем получать результат для каждого среза и объединять результаты вместе, используя pd.merge в индексе.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню