Проклятие многомерности
: по мере роста количества измерений требуется все больше и больше примеров.
Отображение и визуализация данных разброса
. Для отображения данных нам нужны 2 или 3 измерения данных.
Две основные стратегии снижения измерений
- Выбор: выберите лучшие функции и удалите остальные.
- Трансформация: создайте новые функции, которые обобщают комбинации исходных функций.
Две стратегии выбора признаков
- Фильтрация:оцените важность и оставьте самую важную.
a. определение порога отклонения
b. сортировка по коэффициенту корреляции - Оболочка: попробуйте различные комбинации функций, прежде чем выбрать наилучшие результаты
а. Дальний Восток
Фильтр — пороговое значение отклонения
: Использование «Scikit-learn» «VarianceThreshold ()»
Рабочий процесс для использования следующим образом
- префит без порога
- Анализ отклонений
- Выберите порог
- Установите выбранный порог
from sklearn.feature_selection import VarianceThreshold selector = VarianceThreshold() # prefit object with df[cols] → iris data is stored in DataFrame 'df' selector.fit(df[cols]) # check feature variances print(selector.variances_) # choose the threshold selector.set_params(threshold=0.6) # refit and transform, store output out_sel = selector.fit_transform(df[cols]) # check which features are selected print(selector.get_support())
import pandas as pd # filter in the selected features df_cols = df[cols] df_filter = df_cols.iloc[:, selector.get_support()] # add labels to new DataFrame and sanity check df_new = pd.concat([df_filter, df[['species']]], axis=1) print(df_new.head())
Filter — Коэффициент корреляции
: использование встроенного метода «.corr()» «pandas». Кроме того, мы можем использовать «тепловую карту» Seaborn для визуального анализа сразу многих коэффициентов.
- abs(значения), близкие к 1, указывают на наибольшую согласованность или наибольшую отрицательную/положительную корреляцию
- abs(значения), близкие к 0, указывают на самую низкую корреляцию
import matplotlib.pyplot as plt from sklearn.datasets import fetch_california_housing import seaborn as sns housing = fetch_california_housing() df = pd.DataFrame(data=housing.data, columns=housing.feature_names) # feature_names : 8 features' names that can affect to define house value df['MEDV'] = housing.target # add average house value(y) df.index.name = 'record' print(df.head()) # find correlation cor = df.corr() # visualize with seaborn sns.heatmap(cor, annot=False, cmap=plt.cm.Blues) plt.show()
Мы можем выбрать порог, проверив коэффициент r с выходной переменной в паре с каждой входной функцией.
selected_cols = cor_target[cor_target > 0.6] print("selected columns, correltation with target > 0.6") print(selected_cols) print() print(selected_cols.index) print() df_sel = df[selected_cols.index] print(df_sel.head())
Обертка — рекурсивное устранение признаков (RFE)
: Использование встроенного метода scikit-learn под названием «RFE()».
- два направления; вперед или назад
- начните с нуля выбранных функций и добавляйте один или несколько в каждой итерации
- или начните со всех доступных функций и сокращайте их на каждой итерации.
from sklearn.feature_selection import RFE from sklearn.svm import SVC # standard of predicting score in RFE import pandas as pd # load dataset - iris data df = pd.read_csv('./data/iris.csv') # path can be different with me! df.index.name = "record" cols = ['sepal length in cm', 'sepal width in cm', 'petal length in cm', 'petal width in cm'] X = df[cols] y = df['species'] svc = SVC(kernel='linear', C=1) rfe = RFE(estimator=svc, n_features_to_select=2, step=1) # in each iteration, delete 1 feature and finally 2 features are kept. rfe.fit(X, y) print(cols) print(rfe.ranking_) # print score that reflects the contribution of each feature to a good prediction
- n_features_to_select = количество выходных функций
- шаг = количество функций, которые нужно удалить на каждой итерации (по умолчанию = 1).
- ranking_ = ранжирование функций → выбранным функциям присваивается ранг 1
Преобразование
: Преобразование означает вращение данных, чтобы они указывали в более полезном направлении. Существует контролируемый или неконтролируемый случай в преобразовании.
- включает метки данных
- в то время как без присмотра нет
- PCA (анализ основных компонентов) — неконтролируемый
- LDA (линейный дискриминантный анализ) — контролируемый
Трансформация — ППШ
: уменьшение размеров данных неконтролируемым образом
Цель метода заключается в следующем:
- выявление новых векторов признаков
- максимизация дисперсии данных
→ для максимально возможного сохранения характеристик исходных данных. - проецировать исходные данные в новое пространство
import pandas as pd from sklearn.decomposition import PCA import seaborn as sns df = pd.read_csv('./data/iris.csv') df.index.name = "record" cols = ['sepal length in cm', 'sepal width in cm', 'petal length in cm', 'petal width in cm'] pca = PCA(n_components=2) out_pca = pca.fit_transform(df[cols]) # unsupervised - give data only df_pca = pd.DataFrame(data=out_pca, columns=['pca1', 'pca2']) df_pca = pd.concat([df_pca, df[['species']]], axis=1) sns.lmplot(x='pca1', y='pca2', hue='species', data=df_pca, fit_reg=False)
Трансформация — ЛДА
import pandas as pd from sklearn.discriminant_analysis import LinearDiscriminantAnalysis import seaborn as sns df = pd.read_csv('./data/iris.csv') df.index.name = "record" cols = ['sepal length in cm', 'sepal width in cm', 'petal length in cm', 'petal width in cm'] lda = LinearDiscriminantAnalysis(n_components=2) lda.fit(df[cols], df['species']) # Supervised out_lda = lda.transform(df[cols]) df_lda = pd.DataFrame(data=out_lda, columns=['lda1', 'lda2']) df_lda = pd.concat([df_lda, df[['species']]], axis=1) sns.lmplot(x='lda1', y='lda2', hue='species', data=df_lda, fit_reg=False)
n_components
- если 0 ‹ n_components ‹ 1 → процент
- если 0 ‹ n_components ‹ 1 → процент
❉ Подгонка против трансформации
Метод «fit ()» предназначен для обучающих данных, подгонки поезда, установленного для масштабирования. Таким образом, можно применить только набор поездов. Набор тестов нельзя использовать для метода fit() или fit_transform(). Из метода fit () мы получаем среднее значение и значение дисперсии. Затем мы можем преобразовать набор поездов, используя приспособленный масштабатор. И мы также можем трансформировать тестовый набор.
подгонка (набор поездов) → подгонка (набор тестов) (X): причина
Рабочий процесс выглядит следующим образом:
- Создать масштабатор
- подгонка скейлера с помощью набора поездов
- трансформировать набор поездов
- преобразовать тестовый набор
→ «fit_transform()» может выполнять вторую и третью работу вместе!