Выбор признаков с регрессией лассо

Самое краткое и простое руководство по выбору признаков с помощью регрессии Лассо в Python.

Лассо-регрессия для выбора признаков?

Пытаясь минимизировать функцию стоимости, регрессия Лассо автоматически выбирает те функции, которые полезны, отбрасывая бесполезные или избыточные функции. В регрессии Лассо отбрасывание признака сделает его коэффициент равным 0. Кроме того, регрессия Лассо делает модель более обобщаемой для невидимых выборок.

Как выполнить это в Scikit-Learn?

Логистическая регрессия в sklearn выполняет Ридж-регрессию (регуляризация L2) по умолчанию, которая очень хорошо справляется с переоснащением, но неделает коэффициентравным нулю и не поможет нам в удалении избыточные функции, и в этом Ключевое различие между регрессией Риджа и регрессией Лассо. Чтобы вызвать регрессию лассо (Регуляризация L1), нам нужно указать penalty= ‘ l1 ’при вызовелогистической регрессии.

Мы выберем лучшее значение C, т. е. обратное силе регуляризации, путем его точной настройки. Обычно мы изучаем значения от 0 до 1, хотя значения больше 1 также приемлемы.

Мы будем хранить количество ненулевых коэффициентов и метрик, таких как точность, точность, полнота и F1_score, которые дадут более широкое представление о том, сколько функций ненулевые (выбранные) и какие были соответствующие метрики для модели.

Учитывая, что мы уже выполнили тестовый сплит на поезде, мы сразу перейдем к нашей основной цели.

#Listing all values we want to try as C value
C=[1,0.75,0.50, 0.25, 0.1,0.05, 0.025, 0.01, 0.005, 0.0025]
#Intiate Metric of zeros with 6 columns and and rows equal to len(C)
l1_metrics=np.zeros((len(C),6))
#Adding first column as value C
l1_metrics[:,0]=C
# Run a for loop over the range of C list length
for index in range(0, len(C)):
    # Initialize and fit Logistic Regression with the C candidate
    logreg = LogisticRegression(penalty='l1', C=C[index],      solver='liblinear')
    logreg.fit(X_train, y_train)
    # Predict on the testing data
    y_pred = logreg.predict(X_test)
    # Create non-zero count and all metrics columns
    l1_metrics[index,1] = np.count_nonzero(logreg.coef_)
    l1_metrics[index,2] = accuracy_score(y_test, y_pred)
    l1_metrics[index,3] = precision_score(y_test, y_pred)
    l1_metrics[index,4] = recall_score(y_test, y_pred)
    l1_metrics[index,5] = f1_score(y_test, y_pred)

Давайте распечатаем вывод

# Name the columns and print the array as pandas DataFrame
col_names = ['C','Non-Zero Coeffs','Accuracy','Precision','Recall','F1_score']
print(pd.DataFrame(l1_metrics, columns=col_names))

Как выбрать лучшее значение для C?

Мы видим, что самое низкое значение C уменьшает количество ненулевых коэффициентов, а также влияет на производительность показателей. Решение о том, какое значение C выбрать, зависит от стоимости снижения Точности и/или Отзыва.

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

В нашем случае значение C, равное 0,1, соответствует этому критерию, оно уменьшает количество признаков до 17, сохраняя при этом производительность, аналогичную той, что используется с нерегуляризованными моделями.

Другие модели с более низким C начинают испытывать снижение Точности и всех других показателей.

Как получить все выбранные функции и их важность?

#fiting Logistic Regression with C 0.1
logreg = LogisticRegression(penalty='l1', C=0.1, solver='liblinear')
logreg.fit(X_train, y_train)
#We can call logreg.coef_ to get all coefficients
#Lets use this to create data frame with Feature name & coefficient
valuescoef_df=pd.DataFrame(logreg.coef_,columns=X_train.columns).T.reset_index()
coef_df.columns=["Feature","Coef"]
#Filter features with non zero coefficients and sort by coef value
coef_df_final=coef_df[coef_df["Coef"]!=0].sort_values(by="Coef").reset_index(drop=True)
#Lets print feature and its importance 
print(coef_df_final)
Feature      Coef
0   Feature2  -0.932229
1   Feature7  -0.874351
2   Feature3  -0.785099
3   Feature16 -0.575573
4   Feature18 -0.478231
5   Feature20 -0.446400
6   Feature3  -0.307946
7   Feature12 -0.217946
8   Feature21 -0.207946
9   Feature10 -0.192594
10  Feature9  -0.112260
11  Feature17  0.197955
12  Feature24  0.207946
13  Feature11  0.240833
14  Feature19  0.287744
15  Feature21  0.507946
16  Feature5   0.952175

Заключение

Поздравляем!

Мы выбрали наиболее важную функцию из нашего набора данных. Как мы видим, регрессия Лассо — один из самых простых и надежных методов выбора важных функций, сохраняя при этом производительность, аналогичную той, что используется с нерегуляризованными моделями. Это также отличный способ показать вашим нетехническим акционерам, какие факторы являются наиболее важными.

Надеюсь, что эта статья поможет коллеге по Data Scientist и соискателям.

Спасибо, что прочитали эту статью! Не забудьте похлопать 👏 или оставить комментарий 💬! И самое главное, подпишитесь и подпишитесь наme(Vishal), чтобы получать уведомления о моих новых статьях по науке о данных и статистике.