Выбор характеристик действительно ли это важно?

Выбор / извлечение функций - одна из самых важных концепций в машинном обучении, которая представляет собой процесс выбора подмножества соответствующих функций / атрибутов (например, столбца в табличных данных), которые наиболее актуальны для моделирования и бизнес-цели проблемы и игнорирование нерелевантных функций из набора данных.

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

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

Преимущества проектирования функций для вашего набора данных

1. Уменьшите переоснащение

2. Повышает точность

3. Сократите время обучения

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

Метод 1. Рассчитайте количество объектов, стандартное отклонение которого равно нулю. Это постоянные характеристики. Поскольку эти функции не меняются, это не повлияет на производительность модели.

import pandas as pd
import numpy as np
data = pd.read_csv('./train.csv')
print("Original data shape- ",data.shape)
# Remove Constant Features
constant_features = [feat for feat in data.columns if data[feat].std() == 0]
data.drop(labels=constant_features, axis=1, inplace=True)
print("Reduced feature dataset shape-",data.shape)

Метод 2: Рассчитайте количество функций с низкой дисперсией. Это можно применить, используя пороговое значение с помощью VarianceThreshold в библиотеке sklearn.

from sklearn.feature_selection import VarianceThreshold
sel= VarianceThreshold(threshold=0.18)
sel.fit(df)
mask = sel.get_support()
reduced_df = df.loc[:, mask]
print("Original data shape- ",df.shape)
print("Reduced feature dataset shape-",reduced_df.shape)
print("Dimensionality reduced from {} to {}.".format(df.shape[1], reduced_df.shape[1]))

Метод 3. Удалите элементы с высокой корреляцией. Корреляция может быть положительной (увеличение одного значения признака увеличивает значение целевой переменной) или отрицательной (увеличение одного значения признака уменьшает значение целевой переменной)

Корреляция Пирсона выражается следующим образом:

Элементы могут быть удалены с помощью значения «Порог», т. Е. Удалить те функции, которые имеют коэффициент корреляции ›0,8.

import seaborn as sns
import numpy as np
corr=df_iter.corr()
mask = np.triu(np.ones_like(corr, dtype=bool))
# Add the mask to the heatmap
sns.heatmap(corr, mask=mask,  center=0, linewidths=1, annot=True, fmt=".2f")
plt.show()

corr_matrix = df_iter.corr().abs()
# Create a True/False mask and apply it
mask = np.triu(np.ones_like(corr_matrix, dtype=bool))
tri_df = corr_matrix.mask(mask)
# List column names of highly correlated features (r >0.5 )
to_drop = [c for c in tri_df.columns if any(tri_df[c] > 0.5)]
# Drop the features in the to_drop list
reduced_df = df_iter.drop(to_drop, axis=1)
print("The reduced_df dataframe has {} columns".format(reduced_df.shape[1]

Метод 4: определение коэффициентов по признакам с помощью логистической регрессии. Удалите те функции, у которых низкий lr_coef.

from sklearn.preprocessing import StandardScaler 
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
#calculating the coeff with respect to columns 
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
# Perform a 25-75% train test split
X_train, X_test, y_train, y_test = train_test_split(X_std, y, test_size=0.25, random_state=0)
# Create the logistic regression model and fit it to the data
lr = LogisticRegression()
lr.fit(X_train, y_train)
# Calculate the accuracy on the test set
acc = accuracy_score(y_test, lr.predict(X_test))
print("{0:.1%} accuracy on test set.".format(acc)) 
print(dict(zip(X.columns, abs(lr.coef_[0]).round(2))))

Метод 5: Расчет важности функции с помощью XGBoost.

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

import xgboost as xgb
housing_dmatrix = xgb.DMatrix(X,y)
# Create the parameter dictionary: params
params = {"objective":"reg:linear","max_depth":"4"}
# Train the model: xg_reg
xg_reg = xgb.train(dtrain=housing_dmatrix,params=params,num_boost_round=10)
# Plot the feature importances
xgb.plot_importance(xg_reg)

Метод 6: важность функции с использованием дополнительного древовидного классификатора.

Оценщики на основе дерева (см. Модуль sklearn.tree и лес деревьев в модуле sklearn.ensemble) могут использоваться для вычисления важности функций, которые, в свою очередь, могут использоваться для исключения нерелевантных функций.

X = df.iloc[:,0:370]  #independent columns
y = df.iloc[:,-1]    #target column 
from sklearn.ensemble import ExtraTreesClassifier
import matplotlib.pyplot as plt
model = ExtraTreesClassifier()
model.fit(X,y)
print(model.feature_importances_) 
#use inbuilt class feature_importances of tree based classifiers
#plot graph of feature importances for better visualization
feat_importances = pd.Series(model.feature_importances_, index=X.columns)
feat_importances.nlargest(20).plot(kind='barh')
plt.show()

Метод 7: Рекурсивное исключение признаков (RFE)

При наличии внешнего оценщика, который назначает веса признакам (например, коэффициентам линейной модели), рекурсивное исключение признаков (RFE) заключается в выборе признаков путем рекурсивного рассмотрения все меньших и меньших наборов признаков. Во-первых, оценщик обучается на начальном наборе функций, и важность каждой функции определяется либо с помощью атрибута coef_, либо с помощью атрибута feature_importances_. Затем наименее важные функции удаляются из текущего набора функций. Эта процедура рекурсивно повторяется для сокращенного набора до тех пор, пока в конечном итоге не будет достигнуто желаемое количество функций для выбора.

from sklearn.feature_selection import RFE
rfe = RFE(estimator=RandomForestClassifier(random_state=0),n_features_to_select=3,step=2,verbose=1)
rfe.fit(X_train,y_train)
mask=rfe.support_
X_new=X.loc[:,mask]
print(X_new.columns)

Метод 8: Одномерный выбор признаков (ANOVA)

Это работает путем выбора лучших характеристик на основе одномерных статистических тестов (ANOVA). Методы, основанные на F-тесте, оценивают степень линейной зависимости между двумя случайными величинами. Они предполагают линейную связь между объектом и целью. Эти методы также предполагают, что переменные подчиняются распределению Гаусса.

from sklearn.model_selection import train_test_split
from sklearn.feature_selection import f_classif, f_regression
from sklearn.feature_selection import SelectKBest, SelectPercentile
df= pd.read_csv('./train.csv')
X = df.drop(['ID','TARGET'], axis=1)
y = df['TARGET']
df.head()

# Calculate Univariate Statistical measure between each variable and target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)
print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)
univariate = f_classif(X_train.fillna(0), y_train)
# Capture P values in a series
univariate = pd.Series(univariate[1])
univariate.index = X_train.columns
univariate.sort_values(ascending=False, inplace=True)
# Plot the P values
univariate.sort_values(ascending=False).plot.bar(figsize=(20,8))

# Select K best Features
k_best_features = SelectKBest(f_classif, k=10).fit(X_train.fillna(0), y_train)
X_train.columns[k_best_features.get_support()]

# Apply the transformed features to dataset 
X_train = k_best_features.transform(X_train.fillna(0))
X_train.shape

Методы уменьшения размеров

PCA (анализ основных компонентов): -

Исходные данные состоят из 9 столбцов. В этом разделе код проецирует исходные данные, которые являются 9-мерными, в 2-мерные. Я должен отметить, что после уменьшения размерности каждому главному компоненту обычно не присваивается конкретное значение. Новые компоненты - это всего лишь два основных аспекта вариации.

from sklearn.decomposition import PCA
dt=pd.read_csv('./dataset.csv')
X=dt.iloc[0:,0:-1]
y=dt.iloc[:,-1]
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(X)
principalDf = pd.DataFrame(data = principalComponents
             , columns = ['principal component 1', 'principal component 2'])
print("Dimension of dataframe before PCA",dt.shape)
print("Dimension of dataframe after PCA",principalDf.shape)
print(principalDf.head())
finalDf = pd.concat([principalDf, y], axis = 1)
print("finalDf")
print(finalDf.head())

#Visualize 2D Projection
fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1) 
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = [0, 1]
colors = ['r', 'g']
for target, color in zip(targets,colors):
    indicesToKeep = finalDf['Class'] == target
    ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']
               , finalDf.loc[indicesToKeep, 'principal component 2']
               , c = color
               , s = 50)
ax.legend(targets)
ax.grid()

Объясненное отклонение

Объясненная дисперсия говорит вам, сколько информации (дисперсии) можно отнести к каждому из основных компонентов. Это важно, поскольку, хотя вы можете преобразовать 371-мерное пространство в 2-мерное пространство, при этом вы теряете часть дисперсии (информации). Используя атрибут объясненная_вариантность_ratio_, вы можете увидеть, что первый главный компонент содержит 88,85% дисперсии, а второй главный компонент содержит 0,06% дисперсии. Вместе эти два компонента содержат 88,91% информации.

Благодарю вас !