Выбор признаков с регрессией лассо
Самое краткое и простое руководство по выбору признаков с помощью регрессии Лассо в 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), чтобы получать уведомления о моих новых статьях по науке о данных и статистике.