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

Вступление

Когда вы говорите, что модель хороша? Когда модель хорошо работает с невидимыми данными, мы говорим, что это хорошая модель. Как специалист по данным, мы выполняем различные операции, чтобы создать хорошую модель машинного обучения. Операции включают в себя предварительную обработку данных (работа с NA и выбросами, преобразование типов столбцов, уменьшение размерности, нормализация и т. Д.), Исследовательский анализ данных (EDA), настройку / оптимизацию гиперпараметров (процесс поиска наилучшего набора гиперпараметров Алгоритм машинного обучения, обеспечивающий наилучшую производительность), выбор функций и т. Д.

«Мусор на входе, мусор на выходе».
Если данные, введенные в модель машинного обучения, имеют низкое качество, модель будет некачественной.

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







Выбор функции

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

Есть 3 основных метода выбора характеристик

  1. Методы фильтрации
  2. Встроенные методы
  3. Методы обертки
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style=”whitegrid”) 
import warnings
warnings.filterwarnings(‘ignore’) 
# load Iris dataset 
sklearn.datasets import load_iris 
# create input and output features
feature_names = load_iris().feature_names
X_data = pd.DataFrame(load_iris().data, columns=feature_names)
y_data = load_iris().target

1. Методы фильтрации

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

Преимущества:

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

Три типа методов фильтрации:

1. ANOVA F-значение

F-значение ANOVA оценивает степень линейности между входным признаком (т. Е. Независимыми признаками) и выходным признаком (т. Е. Зависимым признаком). Высокое значение F указывает на высокую степень линейности, а низкое значение F указывает на низкую степень линейности.

Scikit-learn предоставляет две функции для вычисления F-значения:

  1. sklearn.feature_selection.f_regression для проблем регрессии
  2. sklearn.feature_selection.f_classif для задач классификации
# import f_classif
from sklearn.feature_selection import f_classif
# create f_classif object
f_value = f_classif(X_data, y_data)
# print the name and F-value of each feature
for feature in zip(feature_names, f_value[0]):
    print(feature)
OUTPUT:
------
('sepal length (cm)', 119.26450218449871) 
('sepal width (cm)', 49.16004008961098) 
('petal length (cm)', 1180.1611822529776) 
('petal width (cm)', 960.0071468018025)

Давайте визуализировать то же самое

# Create a bar chart
plt.figure(figsize=(4,4))
plt.bar(x=feature_names, height=f_value[0], color=’red’)
plt.xticks(rotation=’vertical’)
plt.ylabel(‘F-value’)
plt.title(‘F-value Comparison’)
plt.show()

Недостаток:

Значение F ANOVA фиксирует только линейные отношения между входной и выходной характеристикой.

2. Порог отклонения

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

# import VarianceThreshold
from sklearn.feature_selection import VarianceThreshold
# create VarianceThreshold object
selector = VarianceThreshold(threshold=0.0)
# train and transform
selector.fit_transform(X_data)
# print the name and variance of each feature
for feature in zip(feature_names, selector.variances_):
    print(feature)
OUTPUT:
------
('sepal length (cm)', 0.6811222222222222) 
('sepal width (cm)', 0.1887128888888887) 
('petal length (cm)', 3.0955026666666674) 
('petal width (cm)', 0.5771328888888888)

Давайте представим то же самое

# create a bar chart
plt.figure(figsize=(4,4))
plt.bar(x=feature_names, height=selector.variances_, color=’red’)
plt.xticks(rotation=’vertical’)
plt.ylabel(‘Variance’)
plt.title(‘Variance Comparison’)
plt.show()

Преимущество:

Это можно использовать для обучения без учителя.

Недостаток:

Порог отклонения учитывает только отношения между объектами, но не отношения между входными объектами и выходными объектами.

3. Взаимная информация

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

Scikit-learn предоставляет две функции для вычисления F-значения:

  1. sklearn.feature_selection.mutual_info_classif для проблем регрессии
  2. sklearn.feature_selection.mutual_info_regression для проблем классификации
# import mutual_info_classif
from sklearn.feature_selection import mutual_info_classif
# create mutual_info_classif object
MI_score = mutual_info_classif(X_data, y_data, random_state=0)
# Print the name and mutual information score of each feature
for feature in zip(feature_names, MI_score):
    print(feature)
OUTPUT:
------
('sepal length (cm)', 0.4738732342805525) 
('sepal width (cm)', 0.28607227699171767) 
('petal length (cm)', 0.9895851732491787) 
('petal width (cm)', 0.9749379656705233)

Давайте представим то же самое

# create a bar chart 
plt.figure(figsize=(4,4))
plt.bar(x=feature_names, height=MI_score, color=’red’)
plt.xticks(rotation=’vertical’)
plt.ylabel(‘Mutual Information Score’)
plt.title(‘Mutual Information Score Comparison’)
plt.show()

Преимущество:

MI может фиксировать нелинейные отношения между входными и выходными характеристиками.

4. SelectKBest от Scikit-learn

SelectKBest выбирает признаки с помощью функции (в данном случае F-значение ANOVA), а затем «удаляет все признаки, кроме k с наивысшей оценкой».

# import SelectKBest
from sklearn.feature_selection import SelectKBest
# create a SelectKBest object
skb = SelectKBest(score_func=f_classif, k=2) 
# set f_classif as ANOVA F-value
# Select top 2 features based on the criteria
# train and transform
X_data_new = skb.fit_transform(X_data, y_data)
# print the name of the selected features
for feature_list_index in skb.get_support(indices=True):
    print(feature_names[feature_list_index])
OUTPUT:
------
petal length (cm) 
petal width (cm)

В следующей статье я расскажу о методах Embedded и Wrapper.

Спасибо за чтение!

Мы очень ценим любые отзывы и комментарии!

Некоторые из моих других сообщений могут быть вам интересны,





« is и == в Python
Ускорьте сравнение строк medium.com»