← На главную Воспоминания

Пятница, 12 Января 2024

Прошел курс по фича инжинирингу на кагле

Как можно создавать фичи:

Преобразовывать существующие в новые с помощью математических операций

autos["stroke_ratio"] = autos.stroke / autos.bore

autos["displacement"] = (
    np.pi * ((0.5 * autos.bore) ** 2) * autos.stroke * autos.num_of_cylinders
)

accidents["LogWindSpeed"] = accidents.WindSpeed.apply(np.log1p)

если фичи булеан типа, можно посчитать сколько из них тру и сделать это отдельной колонкой

roadway_features = ["Amenity", "Bump", "Crossing", "GiveWay",
    "Junction", "NoExit", "Railway", "Roundabout", "Station", "Stop",
    "TrafficCalming", "TrafficSignal"]
accidents["RoadwayFeatures"] = accidents[roadway_features].sum(axis=1)

accidents[roadway_features + ["RoadwayFeatures"]].head(10)

разделить одну фичу на несколько

customer[["Type", "Level"]] = (  # Create two new features
    customer["Policy"]           # from the Policy feature
    .str                         # through the string accessor
    .split(" ", expand=True)     # by splitting on " "
                                 # and expanding the result into separate columns
)

Сгрупировать данные и взять среднее по группе, либо одно из следующих по группе max, min, median, var, std, count

customer["AverageIncome"] = (
    customer.groupby("State")  # for each state
    ["Income"]                 # select the income
    .transform("mean")         # and compute its mean
)

customer[["State", "Income", "AverageIncome"]].head(10)

Попытаться кластеризовать данные с помощью алгоритма кластеризации, например k-means. Найденый кластер и будет новой фичей

# Create cluster feature
kmeans = KMeans(n_clusters=6)
X["Cluster"] = kmeans.fit_predict(X)
X["Cluster"] = X["Cluster"].astype("category")

X.head()

Применить метод главных компонент. Найденные значения можно использовать как новые фичи, либо на основе них можно понять как можно применить математические операции к уже известным фичам чтобы создать более полезню фичу

# Standardize
X_scaled = (X - X.mean(axis=0)) / X.std(axis=0)

from sklearn.decomposition import PCA

# Create principal components
pca = PCA()
X_pca = pca.fit_transform(X_scaled)

# Convert to dataframe
component_names = [f"PC{i+1}" for i in range(X_pca.shape[1])]
X_pca = pd.DataFrame(X_pca, columns=component_names)

X_pca.head()

Заэнкодить таргет вместо одной из категорикал фичей с большим количеством потенциальных значений. Т.к некоторые категории могут иметь мало примеров, чтобы защититься от нерепрезентативных результатов можно также при енкодинге использовать среднее по всем значениям, к примеру по формуле encoding = weight * in_category + (1 - weight) * overall

from category_encoders import MEstimateEncoder

# Create the encoder instance. Choose m to control noise.
encoder = MEstimateEncoder(cols=["Zipcode"], m=5.0)

# Fit the encoder on the encoding split.
encoder.fit(X_encode, y_encode)

# Encode the Zipcode column to create the final training data
X_train = encoder.transform(X_pretrain)

Дальше буду изучать advanced sql