Как быстро сгенерировать квадратичные числовые объекты в кадре данных в python? - PullRequest
0 голосов
/ 03 ноября 2018

Используя python и стандартные библиотеки, я хотел бы быстро создать функции взаимодействия для моделей машинного обучения (классификаторы или регрессоры). Поскольку разработка функций вручную может занять много времени, я ищу стандартные библиотеки и методы Python, которые могут полуавтоматизировать некоторые процессы. Например, для генерации квадратичных объектов для анализа у меня есть следующий код:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': ['abc', 'def', 'ghi', 'kjl'],
                   'b': [2, 5, 7, 8],
                   'c': [1.2, 3, 4, 6]})
num_cols = [col for col in df.columns if df[col].dtype in [np.int64, np.float64]]
quadratic_cols = [tuple(sorted((i,j))) for i in num_cols for j in num_cols]
quad_col_pairs = list(set(quadratic_cols))

for col_pair in quad_col_pairs:
    col1, col2 = col_pair
    quadratic_col = '{}*{}'.format(*col_pair)
    df[quadratic_col] = df[col1] * df[col2]

Я хотел бы упростить этот код, потому что этот вид разработки функций должен быть более стандартизированным и быстро развернутым. Также не хватает, потому что потребуется больше строк кода для генерации производных объектов от сложения, вычитания или деления по столбцам объектов.

Как я могу упростить приведенный выше код? Существует ли стандартный метод или библиотека python, которые могут более эффективно генерировать производные функции для построения моделей?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Поскольку вы явно пометили его с помощью scikit-learn: вы можете использовать PolynomialFeatures :

from sklearn.preprocessing import PolynomialFeatures
pf = PolynomialFeatures(include_bias=False)
pf.fit_transform(df._get_numeric_data()) 

#array([[ 2.  ,  1.2 ,  4.  ,  2.4 ,  1.44],
#       [ 5.  ,  3.  , 25.  , 15.  ,  9.  ],
#       [ 7.  ,  4.  , 49.  , 28.  , 16.  ],
#       [ 8.  ,  6.  , 64.  , 48.  , 36.  ]])

Это также дает вам возможность использовать полиномы более высокого порядка и включать только члены взаимодействия.

0 голосов
/ 03 ноября 2018

Попробуйте это для получения необходимых столбцов с обходом циклов,

import itertools
L=df.select_dtypes(include=[np.number]).columns.tolist()
quad_col_pairs =  list(itertools.combinations_with_replacement(L,2))

for col_pair in quad_col_pairs:
    col1, col2 = col_pair
    quadratic_col = '{}*{}'.format(*col_pair)
    df[quadratic_col] = df[col1] * df[col2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...