D03_Предварительная обработка данных и проектирование функций_sklearn

машинное обучение

1 Обзор

1.1 Пять основных процессов интеллектуального анализа данных:

  1. получить данные
  2. предварительная обработка данных
    Предварительная обработка данных — это процесс обнаружения, исправления или удаления поврежденных, неточных или неподходящих записей из данных. Проблемы, с которыми можно столкнуться: различные типы данных, такие как текст, некоторые числа, некоторые с временными рядами, некоторые непрерывные и какой-то прерывистый. Также возможно, что качество данных плохое, есть шум, есть аномалии, есть пропущенные данные, данные неверны, размеры разные, есть повторы, данные искажены, количество данные слишком велики или слишком малы.
    Цель предварительной обработки данных: адаптировать данные к модели и соответствовать потребностям модели.
  3. Разработка функций:
    Инжиниринг признаков — это процесс преобразования необработанных данных в признаки, которые лучше отражают основные проблемы прогностической модели.Это может быть достигнуто путем выбора наиболее релевантных признаков, извлечения признаков и создания признаков. Создание признаков часто реализуется в виде алгоритмов уменьшения размерности.
    Проблемы, с которыми можно столкнуться: есть корреляция между функциями, функции и метки не имеют ничего общего, слишком много или слишком маленькие функции, или просто неспособность показать правильное явление данных или неспособность показать истинное лицо данных.
    Цель разработки признаков: 1) снизить вычислительные затраты, 2) увеличить верхний предел модели.
  4. Моделируйте, тестируйте модель и прогнозируйте результат
  5. Зайдите в Интернет и проверьте эффект модели

1.2 модуль предварительной обработки данных sklearn:

sklearn содержит множество модулей, связанных с предварительной обработкой данных и разработкой функций:

  • Предварительная обработка модуля: содержит почти все для предварительной обработки данных.
  • Модуль Impute: предназначен для подстановки пропущенных значений.
  • Модуль feature_selection: содержит практики для различных методов выбора признаков.
  • Декомпозиция модуля: содержит алгоритмы уменьшения размерности.

2 Предварительная обработка данных

2.1 Безразмерные данные

Обезразмеривание данных может быть линейным или нелинейным. Линейное обезразмеривание включаетЦентрализованная обработка (с нулевым центром или вычитанием среднего)иОбработка масштаба (Scale).Суть централизацииОн заключается в вычитании фиксированного значения из всех записей, то есть смещении данных выборки данных в определенную позицию.Природа масштабированияЭто фиксация данных в определенном диапазоне путем деления на фиксированное значение, и логарифмирование также является процессом масштабирования.

  • Нормализация данных (нормализация, также известная как Min-Max Scaling).x*=xmin(x)max(x)min(x)x^* = \frac{x-min(x)}{max(x)-min(x)}
  • Стандартизация данных (стандартизация, также известная как нормализация Z-оценки).x*=xμоx^* = \frac{x-\mu}{\sigma}
  • Регуляризация
  • preprocessing.MinMaxScale
# (sklearn)
from sklearn.preprocessing import MinMaxScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
import pandas as pd
# pd.DataFrame(data)
#实现归一化
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(data) #通过接口导出结果
print(result)
# result_ = scaler.fit_transform(data) #训练和导出结果一步达成
# scaler.inverse_transform(result) #将归一化后的结果逆转

#使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
scaler = MinMaxScaler(feature_range=[5,10]) #依然实例化
result_1 = scaler.fit_transform(data) #fit_transform一步导出结果
print(result_1)
# (numpy实现归一化)
import numpy as np
X = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])
#归一化
X_nor = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_nor
#逆转归一化
X_returned = X_nor * (X.max(axis=0) - X.min(axis=0)) + X.min(axis=0)
X_returned
  • preprocessing.StandardScaler

Когда данные (x) центрируются по среднему значению (μ), а затем масштабируются по стандартному отклонению (σ), данные будут подчиняться нормальному распределению со средним значением 0 и дисперсией 1 (т. е. стандартное нормальное распределение), и этот процесс, который называется стандартизацией данных (Standardization, также известный как Z-score normalization). Предполагается, что исходные данные имеют нормальное распределение.

from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]

scaler = StandardScaler() #实例化
scaler.fit(data) #fit,本质是生成均值和方差

# scaler.mean_ #查看均值的属性mean_
# scaler.var_ #查看方差的属性var_

x_std = scaler.transform(data) #通过接口导出结果

# x_std.mean() #导出的结果是一个数组,用mean()查看均值
#x_std.std() #用std()查看方差

# scaler.fit_transform(data) #使用fit_transform(data)一步达成结果
# scaler.inverse_transform(x_std)  #使用inverse_transform逆转标准化

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

2.2 Отсутствующие значения

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

  • impute.SimpleImputer

     class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,copy=True)
    
параметр значение
missing_values Сообщите SimpleImputer, как выглядят отсутствующие значения в данных, нулевое значение по умолчанию np.nan
strategy Наша стратегия вменения отсутствующих значений, среднее значение по умолчанию.
Введите «Среднее», чтобы заполнить использование среднего (доступно только для числового «)
Введите «медиану», чтобы заполнить медиану (доступно только для числовых функций)
Введите «most_frequent» с заполнением режима (доступно как для числовых, так и для символьных функций)
Ввод «константы» означает, что необходимо обратиться к значению параметра «fill_value» (доступно как для числовых, так и для символьных функций).
fill_value Доступно, когда параметр startegy является «постоянным», вы можете ввести строку или число, чтобы указать значение для заполнения, обычно 0
copy По умолчанию установлено значение True, что создаст копию матрицы признаков, в противном случае недостающие значения будут заполнены исходной матрицей признаков.
from sklearn.impute import SimpleImputer
Age = data.loc[:,"Age"].values.reshape(-1,1)  #sklearn当中特征矩阵必须是二维
imp_median = SimpleImputer(strategy="median") #实例化,用中位数填补
# imp_mean = SimpleImputer()                  #实例化,默认均值填补
# imp_0 = SimpleImputer(strategy="constant",fill_value=0) #实例化,用0填补

data.loc[:,"Age"] = imp_median.fit_transform(Age) #fit_transform一步完成调取结果 并赋值  (我们使用中位数填补Age)

#使用众数填补Embarked
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent") 
data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)

# 写成一行
data.loc[:,"Age"] = SimpleImputer(strategy="median").fit_transform(data.loc[:,"Age"].values.reshape(-1,1))

data.loc[:,"Embarked"] = SimpleImputer(strategy = "most_frequent").fit_transform(data.loc[:,"Embarked"].values.reshape(-1,1))

Заполнение с помощью Pandas и Numpy на самом деле проще

import pandas as pd
data = pd.read_csv(r".\Narrativedata.csv",index_col=0)

data.loc[:,"Age"] = data.loc[:,"Age"].*fillna*(data.loc[:,"Age"].median())
#.fillna 在DataFrame里面直接进行填补

data.*dropna*(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False

2.3 Обработка категориальных признаков: кодирование и фиктивные переменные

На самом деле многие метки и функции не представлены в виде чисел при сборе данных. Например,ОбразованиеЗначение может быть ["начальная школа", "неполная средняя школа", "средняя школа", "университет"],Способы оплатыМожет содержать ["Alipay", "Cash", "WeChat"] и т. д. В этом случае для того, чтобы вписать данные в алгоритмы и библиотеки, мы должныкодировать данные, этотекстовые данныепреобразовать вЧисловой.

  • preprocessing.LabelEncoder: посвященный этикетке, можетклассификация текстовпреобразовать вКатегориальные значения
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()       #实例化
y = data.iloc[:,-1]       #要输入的是标签,不是特征矩阵,所以允许一维
le = le.fit(y)            #导入数据
label = le.transform(y)   #transform接口调取结果  可查看获取的结果label
# le.classes_             #属性.classes_查看标签中究竟有多少类别
data.iloc[:,-1] = label   #让标签等于我们运行出来的结果


# 写成一行
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

#PS: Посмотреть значение переменной -- метод:
Вы можете [после уменьшения размерности. ravel(), а затем] взять set set() -- de-duplication
или есть один в pd.value_counts()Методы

  • set -- set(dataxxx.ravel()) Данные, которые должны быть сведены к одному измерению Как правило, тип (данные) данных возвращаемого значения - numpy.ndarray, который может быть (890,1) Требуется уменьшение измерения
  • value_counts() -- pd.DataFrame(dataxxx).value_counts() Объект, который нужно преобразовать в pandas, можно просмотреть В numpy нет .value_counts()
  • preprocessing.OrdinalEncoder: специфичный для функций, способный преобразовывать категориальные функции в категориальные значения.
from sklearn.preprocessing import OrdinalEncoder

data_1 = data.copy()

OrdinalEncoder().fit(data_1.iloc[:,1:-1]).categories_ #接口*categories_*对应LabelEncoder的接口classes_,一模一样的功能

data_1.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_1.iloc[:,1:-1])

  • preprocessing.OneHotEncoder: Горячее кодирование, создание фиктивных переменных

Функции могут быть фиктивными переменными, как и метки? Да, используя класс sklearn.preprocessing.LabelBinarizerВы можете сделать фиктивные переменные для меток

image.png

Типы данных и часто используемая статистика

image.png

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()

#依然可以直接一步到位
# OneHotEncoder(categories='auto').fit_transform(X).toarray()

#依然可以还原
# pd.DataFrame(enc.inverse_transform(result))

enc.get_feature_names()  # 获取编码后的特征名字 可以看看:array(['x0_female', 'x0_male', 'x1_C', 'x1_Q', 'x1_S'], dtype=object)

#axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)

newdata.drop(["Sex","Embarked"],axis=1,inplace=True)

newdata.columns =
["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]  # 对列重命名

2.4 Обработка непрерывных функций: бинаризация и сегментация

  • sklearn.preprocessing.Binarizer: Бинаризация данных в соответствии с порогом (установите собственные значения на 0 или 1) для непрерывных переменных. Значения, превышающие пороговое значение, сопоставляются с 1, а значения, меньшие или равные пороговому значению, сопоставляются с 0. При пороговом значении по умолчанию 0 все положительные значения в признаке сопоставляются с 1.
#将年龄二值化
data_2 = data.copy()

from sklearn.preprocessing import Binarizer
X = data_2.iloc[:,0].values.reshape(-1,1) #类为特征专用,所以不能使用一维数组

transformer = Binarizer(threshold=30).fit_transform(X)
transformer
  • sklearn.preprocessing.KBinsDiscretizer: это класс, который делит непрерывные переменные на категориальные переменные.Непрерывные переменные можно сортировать и группировать по порядку, а затем кодировать.

    n_bins: количество бинов в каждом объекте, по умолчанию 5, которые будут применены ко всем импортированным объектам одновременно.
    encode: Метод кодирования, по умолчанию "onehot". «onehot»: создать фиктивную переменную, а затем вернуть разреженную матрицу, каждый столбец — это категория в признаке, выборка, содержащая эту категорию, представлена ​​как 1, а выборка без нее представлена ​​как 0; «порядковый номер»: каждый функция каждой функции Бункеры кодируются как целое число, и каждый столбец является функцией, и каждая функция содержит матрицу бинов, закодированных различными целыми числами; «горячая плотность»: создайте фиктивную переменную, затем верните плотный массив.
    strategy: Способ определения ширины бина, по умолчанию "квантиль". «uniform»: указывает на бинирование равной ширины, то есть разница между максимальными значениями каждого бина в каждой функции составляет (feature.max() — feature.min())/(n_bins); «quantile»: указывает на равное бинирование, то есть количество выборок в каждом бине в каждой функции одинаково; «kmeans» означает бинирование путем кластеризации, значения в каждом бине кластеризуются до ближайшего одномерного опыта кластеризации k-средних такое же расстояние

from sklearn.preprocessing import KBinsDiscretizer
X = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)

#查看转换后分的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel())
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')

#查看转换后分的箱:变成了哑变量
est.fit_transform(X).toarray()

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

特征提取(feature extraction):从文字,图像,声音等其他非结构化数据中提取新信息作为特征。比如说,从淘宝宝贝的名称中提取出产品类别,产品颜色,是否是网红产品等等。
特征创造(feature creation):把现有特征进行组合,或互相计算,得到新的特征。比如说,我们有一列特征是速度,一列特征是距离,我们就可以通过让两列相处,创造新的特征:通过距离所花的时间。
特征选择(feature selection):从所有的特征中,选择出有意义,对模型有帮助的特征,以避免必须将所有特征都导入模型去训练的情况。
特征工程的第一步是:理解业务。

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

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

3.1 Метод фильтрации

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

3.1.1 Фильтрация отклонений --- обычно только предварительная обработка

(VarianceThreshold) Это класс для фильтрации признаков по их дисперсии. VarianceThreshold имеет важный параметр threshold, представляющий собой порог дисперсии, что означает, что все признаки с дисперсией меньше порога отбрасываются.Если не заполнено, по умолчанию 0, то есть удаляются все записи с одним и тем же признаком.
Например, дисперсия самого признака очень мала, а это значит, что выборки в принципе не отличаются по этому признаку.Большинство значений у признака может быть одинаковым, или даже значение всего признака равно Тогда эта функция не влияет на различение сэмплов.Следовательно, независимо от того, что будет делать следующая разработка признаков, необходимо преимущественно исключить признаки с дисперсией, равной 0.
При нормальных обстоятельствах мы будем использовать фильтрацию дисперсии только с порогом 0 или небольшим порогом, чтобы исключить некоторые явно неиспользуемые для нас функции, а затем мы выберем лучший метод выбора функций, чтобы продолжать сокращать количество функций.

3.1.2 Корреляционная фильтрация

Мы хотим выбрать функции, которые имеют отношение к этикеткам и имеют смысл, потому что такие функции могут предоставить нам много информации. Если функции не имеют ничего общего с метками, это просто приведет к пустой трате нашей вычислительной памяти и, возможно, добавит шума в модель. В sklearn у нас есть три общих метода для оценки корреляции между функциями и метками:Бангла,F-тест,взаимная информация.
Рекомендация: сначала используйте фильтрацию отклонений, а затем отправляйте информацию о пользователях для сбора корреляций. В документации есть таблица sklearn-резюме этих классов, которую можно добавить при просмотре.

А. Фильтр хи-квадрат

Фильтрация хи-квадрат — это корреляционный фильтр, специально предназначенный для дискретных меток (т. е. задач классификации). Класс теста хи-квадратfeature_selection.chi2Рассчитайте статистику хи-квадрат между каждым неотрицательным признаком и меткой и ранжируйте признаки в соответствии со статистикой хи-квадрат от большего к меньшему. рекомбинацияfeature_selection.SelectKBestЭто можно ввести в «критерии оценки», чтобы выбрать K лучших классов объектов с наивысшей оценкой, мы можем использовать это для удаления функций, которые, скорее всего, не зависят от метки и не имеют отношения к нашей цели классификации.

from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectKBest #SelectKBest(依赖的统计量,k ) :输入 评分标准(统计量) 来选出前k个 (统计量)分数最高的特征 (的类)
from sklearn.feature_selection import chi2        #卡方 

#假设在这里我一直我需要300个特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)  #SelectKBest(chi2, k=300):选出前300个卡方分数最高的特征; X_fsvar是经过方差过滤后的数据

#X_fschi.shape

#交叉验证查看模型效果
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()  #RFC是随机森林分类器

Выберите значение гиперпараметра k: SelectKBest (зависимая статистика [chi2--chi-square], k) -- модель, которая может быть создана из chi2.chi2(X_fsvar,y)соответствующие каждому признаку можно получить вЗначение хи-квадратир-значение

chivalue, pvalues_chi = chi2(X_fsvar,y)  #返回第一个值是卡方值 第二个值是p值
chivalue   # 卡方值 可打印查看
pvalues_chi  #p值 可打印查看 ## 若所有的p值都<0.05或0.01 说明所有的特征都和标签相关

# 求k
k = chivalue.shape[0] - (pvalues_chi > 0.05).sum()   #k 想保留的特征个数 =  chivalue.shape[0]总特征数 - (pvalues_chi > 0.05).sum() 想删除的特征的个数

# 之后再实例化卡方检验过滤SelectKBest(chi2, k=填写具体的k) 再训练导出fit_transform 再交叉验证
X_fschi = SelectKBest(chi2, k=填写具体的k).fit_transform(X_fsvar, y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

B. Тестовый фильтр F

F-тест, также известный как ANOVA, тест на однородность дисперсии, представляет собой метод фильтрации, используемый для определения линейной зависимости между каждым признаком и меткой. Он может выполнять как регрессию, так и классификацию, поэтому содержитfeature_selection.f_classif (классификация F-теста)иfeature_selection.f_regression (регрессия F-теста)два класса.
Как и тест хи-квадрат, эти два класса необходимо использовать в сочетании с классом SelectKBest, и мы также можем напрямую судить о том, какой К мы хотим установить, через выходную статистику. Следует отметить, что эффект F-теста очень стабилен, когда данные следуют нормальному распределению, поэтому при использовании фильтра F-теста мы сначала преобразуем данные, чтобы они следовали нормальному распределению.
F-провереноПриродаОн заключается в том, чтобы найти линейную связь между двумя наборами данных, и его нулевая гипотеза состоит в том, что «между данными нет существенной линейной зависимости». он возвращаетсяЗначение Fир-значениедве статистики. Подобно фильтрации хи-квадрат,Мы хотим выбрать функции с p-значениями менее 0,05 или 0,01, которые значительно линейно связаны с меткой., и p-значениебольше, чемПризнак 0,05 или 0,01 рассматривается нами как метка суммынетХарактеристики значимой линейной зависимости,следует удалить.

from sklearn.feature_selection import f_classif
 
F, pvalues_f = f_classif(X_fsvar,y)
 
F  #返回的F值
 
pvalues_f  #返回的p值

# 求k
k = F.shape[0] - (pvalues_f > 0.05).sum()

# 之后再实例化F检验过滤SelectKBest(f_classif, k=填写具体的k) 再训练导出fit_transform 再交叉验证
X_fsF = SelectKBest(f_classif, k=填写具体的k).fit_transform(X_fsvar, y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fsF,y,cv=5).mean()

c. Закон о взаимной информации

Метод взаимной информации — это метод фильтрации, используемый для захвата любых отношений (включая линейные и нелинейные отношения) между каждым объектом и меткой. Подобно F-тесту, он может выполнять как регрессию, так и классификацию и содержит два класса.feature_selection.mutual_info_classif (классификация взаимной информации)иfeature_selection.mutual_info_regression (регрессия взаимной информации). Использование и параметры этих двух классов точно такие же, как у F-теста, но метод взаимной информации более мощный, чем F-тест.F-тестможно найти только линейную зависимость, иВзаимная информацияВозможны произвольные отношения.
закон о взаимной информацииНетВозвращает статистику, подобную p-значению или F-значению, котораяВозвращает «оценку количества взаимной информации между каждой функцией и целью»., эта оценка принимает значение между [0,1], 0 означает две переменныенезависимый,за1означает две переменныеполностью соответствующий.

from sklearn.feature_selection import mutual_info_classif as MIC
 
result = MIC(X_fsvar,y)  #返回的result是每个特征与目标之间的互信息量的估计 

# 求k
k = result.shape[0] - sum(result <= 0)

# 之后再实例化互信息法过滤SelectKBest(MIC, k=填写具体的k) 再训练导出fit_transform 再交叉验证
X_fsmic = SelectKBest(MIC, k=填写具体的k).fit_transform(X_fsvar, y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()

3.2 Встроенный метод

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

Недостатки метода встраивания:
1) Статистика, используемая в методе фильтрации, может использовать статистические знания и здравый смысл для нахождения диапазона (например, значение p должно быть ниже уровня значимости 0,05), в то время как весовой коэффициент, используемый в методе встраивания, не есть такой диапазон, чтобы найти. [Когда в модель вносят вклад большое количество признаков, и вклады разные, трудно определить эффективный порог. В данном случае весовой коэффициент модели является нашим гиперпараметром, и нам может понадобиться кривая обучения, либо судить об оптимальном значении этого гиперпараметра по некоторым свойствам самой модели. 】
2) Метод встраивания вводит алгоритм для выбора признаков, поэтому скорость его расчета также будет иметь большое значение для применяемого алгоритма. Если объем вычислений велик, Это медленный алгоритм, да и сам метод встраивания тоже очень трудоемкий и трудоемкий.

feature_selection.SelectFromModel
class sklearn.feature_selection.SelectFromModel (estimator, threshold=None, prefit=False, norm_order=1, max_features=None)

  • estimator: Можно использовать оценщик модели, если это модель с атрибутами feature_importances_ или coef_, или модели с штрафными условиями l1 и l2.
  • threshold: Порог важности функции, функции с важностью ниже этого порога будут удалены.
  • prefit : значение по умолчанию — False, которое определяет, следует ли передавать созданную модель непосредственно конструктору. Если значение равно True, то fit и transform должны вызываться напрямую, fit_transform нельзя использовать, а SelectFromModel нельзя использовать с cross_val_score, GridSearchCV и подобными утилитами, клонирующими оценщики.
  • norm_order : k может вводить ненулевое целое число, положительную бесконечность, отрицательную бесконечность, значение по умолчанию равно 1. Порядок нормы вектора коэффициентов, используемый для фильтрации коэффициентов ниже порога в случаях, когда атрибут coef_ средства оценки выше одномерного.
  • max_features : максимальное количество функций для выбора при пороговом значении. Чтобы отключить порог и выбирать только на основе max_features, установите threshold=-np.inf

SelectFromModel — это метапреобразователь, который можно использовать с любым оценщиком, который имеет атрибуты coef_, feature_importances_ или необязательные условия штрафа в параметрах после подгонки (например, модели случайного леса и дерева имеют атрибут feature_importances_, логистическая регрессия имеет l1 и l2 штрафные термины, линейный SVM также поддерживает термин штрафа l2).
Для моделей с feature_importances_ функции считаются неважными и удаляются, если важность ниже заданного порогового параметра. Диапазон значений feature_importances_ – [0, 1]. Если пороговое значение установлено на небольшое значение, например 0,001, те функции, которые вообще не влияют на прогнозирование меток, могут быть удалены. Если установлено очень близко к 1, могут остаться только одна или две функции.

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFC

RFC_ = RFC(n_estimators =10,random_state=0) #随机森林实例化

X_embedded = SelectFromModel(RFC_,threshold=0.005).fit_transform(X,y)
 
#在这里我只想取出来有限的特征。0.005这个阈值对于有780个特征的数据来说,是非常高的阈值,因为平均每个特征
# 只能够分到大约0.001的feature_importances_
 
X_embedded.shape
 
#模型的维度明显被降低了
#同样的,我们也可以画学习曲线来找最佳阈值

# 交叉验证 cross_val_score(RFC_,X_embedded,y,cv=5).mean()

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

3.3 Способ упаковки в обертку

Упаковка также являетсяВыбор признаков и обучение алгоритму выполняются одновременноМетод, который очень похож на метод встраивания, также зависит от выбора самого алгоритма, такого как атрибут coef_ или атрибут feature_importances_, для завершения выбора признаков.
Но разница в том, что мы часто используем целевую функцию в качестве черного ящика, чтобы помочь нам выбрать функции, вместо того, чтобы самостоятельно вводить определенную метрику оценки или статистический порог.
способ упаковкиОценщик обучается на начальном наборе функций, и важность каждой функции определяется с помощью атрибута coef_ или атрибута feature_importances_. Затем из текущего набора функцийОбрежьте наименее важные функции. на обрезанном наборерекурсивно повторятьЭтот процесс выполняется до тех пор, пока, наконец, не будет достигнуто желаемое количество объектов для выбора.
метод фильтрациииВстроенный методОдин тренинг для решения всех проблем
способ упаковкиИспользование подмножеств функцийнеоднократнообучение, поэтому оно требует самых высоких вычислительных затрат.

Алгоритм выбора подмножества признаков в методе упаковкинетАлгоритм классификации или регрессии, который мы использовали для импорта данных (т. е. не случайные леса), а специализированныеАлгоритмы интеллектуального анализа данных, это нашцелевая функция. Эти алгоритмы интеллектуального анализа данныхосновная функцияэтоВыберите лучшее подмножество функций.
Наиболее типичная целевая функцияРекурсивная функция устранения(Рекурсивное устранение признаков, сокращенноRFE). Это жадный алгоритм оптимизации, целью которого является поиск наиболее эффективного подмножества функций.
Он итеративно строит модель, сохраняя лучшие функции или отбрасывая худшие функции на каждой итерации, а на следующей итерации строит следующую модель, используя функции, которые не были выбраны в предыдущем моделировании, до тех пор, пока все функции не будут использованы до конца. Затем он ранжирует признаки в соответствии с порядком их сохранения или отбраковки и, наконец, выбирает оптимальное подмножество.
Эффект метода упаковки является наиболее способствующим повышению производительности модели среди всех методов выбора признаков, и он позволяет достичь отличных результатов с небольшим количеством признаков. Метод упаковки — это метод выбора признаков, который может наилучшим образом гарантировать эффект модели.

  • feature_selection.RFE

class sklearn.feature_selection.RFE (estimator, n_features_to_select=None, step=1, verbose=0)

参数:
estimator是需要填写的实例化后的评估器,
n_features_to_select是想要选择的特征个数,
step表示每次迭代中希望移除的特征个数。
.support_ 属性:返回所有的特征的是否最后被选中的布尔矩阵
.ranking_ 属性:返回特征的按数次迭代中综合重要性的排名。
# 包装法: 采用获取性能最佳的特征子集的数据挖掘算法-RFE 递归特征消除法
from sklearn.feature_selection import RFE

RFC_ = RFC(n_estimators =10,random_state=0) # 随机森林分类器实例化

selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y)  #这行就是数据挖掘!!! 获取最佳特征子集  返回的selector是实例化后再fit的结果 再通过相关属性和接口查看信息

selector.support_.sum()   # sum后是340个所选的True
selector.ranking_ 

X_wrapper = selector.transform(X)   #得到的特征矩阵

cross_val_score(RFC_,X_wrapper,y,cv=5).mean()

3.4 Резюме выбора функций

Фильтрация быстрее, но грубее. Метод упаковки и метод встраивания являются более точными и более подходящими для настройки конкретного алгоритма, но объем вычислений относительно велик, а время работы велико.
когдаогромное количество данныхКогда необходимо использовать дисперсионную фильтрацию и настройку взаимной информации, а затем использовать другие методы выбора признаков.
использоватьлогистическая регрессия, метод встраивания является предпочтительным.
использоватьОпорные векторные машиныКогда метод упаковки является предпочтительным.
Если вы запутались, начните с метода фильтрации и посмотрите на конкретные данные для конкретного анализа.