Пятница, 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