разработка функций: использовать знания предметной области и существующие данные для создания новых функций для использования в алгоритмах машинного обучения; может выполняться вручную или автоматически. Автоматическая разработка признаков нейронных сетей часто не подходит для других сложных задач в реальности. Поэтому эта статья в основном посвящена интеллектуальному анализу данных и традиционному машинному обучению и не будет затрагивать такие области глубокого обучения, как распознавание изображений и обработка естественного языка.
Как говорится:Инжиниринг данных и признаков определяет верхний предел модели, и улучшение алгоритма просто приближается к этому верхнему пределу..
На канале Douban Books выполните поиск по ключевому слову «разработка функций», и результаты поиска показывают, что есть только два данных с оценкой 7 или выше, а именноОсвоение функциональной инженерии,Введение и практика разработки функций
Когда размер данных ограничен, «инженерия функций» очень важна, но в этой области опубликовано мало статей, и нет глобального и систематического объяснения теории инженерии функций и реальных боевых действий, поэтому я хочу объединить опыт работы, связанный с книги и отличные статьи.Набор общих методологий разработки научных данных и функций, обобщенных et al.
отсюда\newcommand\colorful{\color{red}} \colorful{понимание функций, очистка функций, построение функций, преобразование функций} и другие параметры, которые нужно расширять и объяснять шаг за шагомтеорияиКоди т. д. Что касается части реализации кода, данные, относящиеся к компании, не могут быть раскрыты, поэтому «Титаник» был выбран для раскрытия данных.
import pandas as pd
import numpy as np
import seaborn as sns
df_titanic = sns.load_dataset('titanic')
Поля данных описываются следующим образом:
Во-первых, понимание характеристик
1.1 Отличие структурированных данных от неструктурированных
Например, некоторые данные, хранящиеся в табличной форме, являются структурированными данными, а неструктурированные данные представляют собой набор данных, похожих на текст, сообщения, журналы и тому подобное.
1.2 Различать количественные и качественные данные
- Количественные данные: относится к некоторому числовому значению, которое используется для измерения количества чего-либо;
- Качественные данные: относятся к категориям, описывающим свойства чего-либо.
2. Очистка объектов
Цель состоит в том, чтобы улучшить качество данных и снизить риск некорректного моделирования алгоритмами.
В реальном процессе бизнес-моделирования часто возникают различные проблемы с данными, такие как неполные, зашумленные и противоречивые данные. И эти данные с дезинформацией могут негативно повлиять на модель.
Процесс очистки данных включает в себяВыравнивание данных, обработка пропущенных значений, обработка выбросов, преобразование данных и т. д.обработка данных.
2.1 Выравнивание данных
В основном это выравнивание времени, полей и связанных с ними измерений.
1 раз:
- Несовместимые форматы даты ['2019-07-20', '20190720', '2019/07/20', '20/07/2019']
- Единицы временной метки непоследовательны, некоторые выражаются в секундах, а некоторые в миллисекундах;
- Используйте недопустимое представление времени, временные метки используют 0, а конечные временные метки используют FFFF.
2) Поле:
- Имя пишется с полом, идентификационный номер пишется с номером мобильного телефона и т. д.
3) Размеры:
- Тип значения унифицирован [например, 1, 2.0, 3.21E3, четыре].
- Единицы унифицированы [например, 180 см, 1,80 м]
2.2 Отсутствие обработки
в основном включаетнесколько удаленийслучае, рассмотретьне обрабатыватьилиудалить недостающие данныеилиЗаполните средним значением, медианой, модой и средним значением класса.
Когда пропущенные значения сильно влияют на модель и имеется много непропущенных данных, можно использовать методПредсказание моделиилиинтерполяцияПуть. Если пропущено слишком много значений, вы можетепропущенное значениевыполнять операции кодирования.
Рассчитайте долю пропущенных значений для каждого поля, а затем сформулируйте стратегии в соответствии с долей пропущенных значений и важностью поля, что может быть представлено следующим рисунком:
Нулевое суммарное распределение
df_titanic.isnull().sum()
survived 0
pclass 0
sex 0
age 177
sibsp 0
parch 0
fare 0
embarked 2
class 0
who 0
adult_male 0
deck 688
embark_town 2
alive 0
alone 0
1) удалить кортеж
Удаляйте объекты (кортежи, записи) с отсутствующими значениями информационных атрибутов для получения полной информационной таблицы.
преимущество:
Его просто и легко реализовать, и он эффективен, когда объект имеет несколько пропущенных значений атрибутов, а удаленные объекты с пропущенными значениями очень малы по сравнению с объемом данных исходного набора данных;
недостаточный:
Когда доля отсутствующих данных велика, особенно когда отсутствующие данные не распределяются случайным образом, этот метод может привести к отклонению данных и неправильным выводам.
Код
В поле embark_town 2 пустых значения, можно рассмотреть возможность удаления отсутствующей обработки
df_titanic[df_titanic["embark_town"].isnull()]
df_titanic.dropna(axis=0,how='any',subset=['embark_town'],inplace=True)
2) заполнение данных
Заполните пустое значение определенным значением, чтобы заполнить информационную таблицу. Обычно на основе статистических принципов пропущенное значение заполняется в соответствии с распределением значений остальных объектов в исходном наборе данных.
а) заполнение вручную)
Заполните вручную на основе бизнес-знаний.
(b) Обработка значений отсутствующих атрибутов как специальных значений
Обрабатывайте нулевое значение как особое значение свойства, которое отличается от любого другого значения свойства. Например, все нулевые значения заполнены «неизвестно». Обычно в качестве временной заливки или промежуточного процесса.
Код
df_titanic['embark_town'].fillna('unknown', inplace=True)
(c) Заполнение статистики
Если отсутствующий показатель низкий (менее 95%) и важность низкая, он будет заполнен в соответствии с распределением данных.
Общая статистика заполнения:
Средняя стоимость: для данных с равномерным распределением заполните пропущенные значения средним значением переменной.
медиана: для данных с асимметричным распределением медиана используется для заполнения пропущенных значений.
Режим: Дискретные объекты могут использовать режим для заполнения пропущенных значений.
- Медианное заполнение
fare: Есть много пропущенных значений, и медиана используется для заполнения.
df_titanic['fare'].fillna(df_titanic['fare'].median(), inplace=True)
- Заполнение режима
embarked: есть только два пропущенных значения, заполненных режимом
df_titanic['embarked'].isnull().sum()
执行结果:2
df_titanic['embarked'].fillna(df_titanic['embarked'].mode(), inplace=True)
df_titanic['embarked'].value_counts()
执行结果:
S 64
- Заполнить пропущенные значения импутером
Класс импутатора предоставляет базовые стратегии обработки отсутствующих значений, такие как использование среднего значения, медианы и режима строки или столбца, в которых находится отсутствующее значение, для замены отсутствующего значения. Этот класс также совместим с различными кодировками отсутствующих значений.
Заполните пропущенные значения:sklearn.preprocessing.Imputer (missing_values = 'NaN', стратегия = 'среднее', ось = 0, подробный = 0, копия = True)
Описание основного параметра:
недостающие_значения: отсутствующие значения, которые могут быть целыми числами или NaN (отсутствующие значения numpy.nan представлены строкой «NaN»), по умолчанию используется стратегия NaN: стратегия замены, строка, замененная средним значением по умолчанию ① Если это среднее значение, используйте Замените среднее значение столбца признаков ② Если это медиана, замените его медианой столбца признаков ③ Если оно наиболее частое, замените ось режимом столбца признаков: укажите количество осей , ось по умолчанию = 0 представляет столбец, а ось = 1 представляет копию строки: если установлено значение «Истина», это означает, что не изменять исходный набор данных. Если установлено значение «Ложь», он будет изменен на месте. В следующих случаях , даже если для него установлено значение False, он не будет изменен на месте ① X не является массивом значений с плавающей запятой ② X является разреженным иmissing_values = 0 ③ ось = 0 и X является матрицей CRS ④ ось =1, а X — матрица CSC.
- Однородное среднее заполнение
возраст: сгруппированы по полу, классу и тому, кто, если они попадают в одну группу, заполняют средним значением или медианой этой группы.
df_titanic.groupby(['sex', 'pclass', 'who'])['age'].mean()
执行结果:
sex pclass who
female 1 child 10.333333
woman 35.500000
2 child 6.600000
woman 32.179688
3 child 7.100000
woman 27.854167
male 1 child 5.306667
man 42.382653
2 child 2.258889
man 33.588889
3 child 6.515000
man 28.995556
Name: age, dtype: float64
age_group_mean = df_titanic.groupby(['sex', 'pclass', 'who'])['age'].mean().reset_index()
age_group_mean
执行结果:
sex pclass who age
0 female 1 child 10.333333
1 female 1 woman 35.500000
2 female 2 child 6.600000
3 female 2 woman 32.179688
4 female 3 child 7.100000
5 female 3 woman 27.854167
6 male 1 child 5.306667
7 male 1 man 42.382653
8 male 2 child 2.258889
9 male 2 man 33.588889
10 male 3 child 6.515000
11 male 3 man 28.995556
def select_group_age_median(row):
condition = ((row['sex'] == age_group_mean['sex']) &
(row['pclass'] == age_group_mean['pclass']) &
(row['who'] == age_group_mean['who']))
return age_group_mean[condition]['age'].values[0]
df_titanic['age'] =df_titanic.apply(
lambda x: select_group_age_median(x) if np.isnan(x['age']) else x['age'],axis=1)
执行结果:
0 22.000000
1 38.000000
2 26.000000
3 35.000000
4 35.000000
...
886 27.000000
887 19.000000
888 27.854167
889 26.000000
890 32.000000
sns.distplot(df_titani
(d) Заполнение предсказания модели
Используйте поля для заполнения в качестве меток и отсутствие отсутствующих данных в качестве обучающих данных, постройте модель классификации/регрессии, спрогнозируйте и заполните отсутствующие поля для заполнения.
Ближайший сосед (KNN)
Сначала определите K выборок, ближайших к выборке с отсутствующими данными, согласно евклидову расстоянию или корреляционному анализу, и используйте средневзвешенное значение/голос этих значений K для оценки отсутствующих данных выборки.
Регрессия
На основе полного набора данных составляется уравнение регрессии. Для объектов, которые содержат нулевые значения, введите оценочное значение, подставив известное значение свойства в уравнение для оценки неизвестного значения свойства. Когда переменные не связаны линейно, что может привести к смещенным оценкам, часто используется линейная регрессия.
Код
возраст: отсутствующее значение относительно велико, и шесть признаков пола, pclass, who, fare, parch и sibsp используются для построения модели случайного леса, чтобы заполнить отсутствующее значение возраста.
df_titanic_age = df_titanic[['age', 'pclass', 'sex', 'who','fare', 'parch', 'sibsp']]
df_titanic_age = pd.get_dummies(df_titanic_age)
df_titanic_age.head()
执行结果为
age pclass fare parch sibsp sex_female sex_male who_child who_man who_woman
0 22.0 3 7.2500 0 1 0 1 0 1 0
1 38.0 1 71.2833 0 1 1 0 0 0 1
2 26.0 3 7.9250 0 0 1 0 0 0 1
3 35.0 1 53.1000 0 1 1 0 0 0 1
4 35.0 3 8.0500 0 0 0 1 0 1 0
# 乘客分成已知年龄和未知年龄两部分
known_age = df_titanic_age[df_titanic_age.age.notnull()]
unknown_age = df_titanic_age[df_titanic_age.age.isnull()]
# y 即目标年龄
y_for_age = known_age['age']
# X 即特征属性值
X_train_for_age = known_age.drop(['age'], axis=1)
X_test_for_age = unknown_age.drop(['age'], axis=1)
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
rfr.fit(X_train_for_age, y_for_age)
# 用得到的模型进行未知年龄结果预测
y_pred_age = rfr.predict(X_test_for_age)
# 用得到的预测结果填补原缺失数据
df_titanic.loc[df_titanic.age.isnull(), 'age'] = y_pred_age
sns.distplot(df_titanic.age)
(e) Интерполяционное заполнение
Включая случайную интерполяцию, множественную интерполяцию, интерполяцию горячего плато, интерполяцию Лагранжа, интерполяцию Ньютона и т. д.
- Линейная интерполяция
Расчетное значение пропущенного значения может быть рассчитано с использованием метода интерполяции.Так называемый метод интерполяции заключается в оценке значения промежуточной точки через две точки (x0, y0), (x1, y1), предполагая, что y=f (x) представляет собой прямую линию, через которую можно вычислить функцию f(x) из двух точек , а затем, если вы знаете x, вы можете найти y для оценки недостающего значения.
Метод .interpolate(method = 'linear', axis) заменит значения NaN значениями вдоль заданной оси с помощью линейной интерполяции, разница представляет собой среднее значение до и после или выше и ниже
df_titanic['fare'].interpolate(method = 'linear', axis = 0)
В то же время вы также можете вставлять значения строк
df_titanic['fare'].interpolate(method = 'linear', axis = 1)
Код
df_titanic['fare'].interpolate()
- Множественное вменение
Идея многозначного вменения исходит из байесовской оценки, которая считает, что вмененное значение является случайным, а его значение исходит из наблюдаемого значения. На практике интерполируемое значение обычно оценивается, а затем добавляются различные шумы для формирования нескольких наборов необязательных интерполируемых значений. В соответствии с определенной основой выбора выберите наиболее подходящее значение интерполяции.
Метод множественного вменения делится на три этапа:
Шаг 1: Создайте набор возможных значений вменения для каждого нулевого значения, которые отражают неопределенность неотвечающей модели;
Каждое значение можно использовать для заполнения отсутствующих значений в наборе данных, в результате чего получается несколько полных наборов данных;
Шаг 2: каждый набор данных вменения подвергается статистическому анализу с использованием статистического метода для полного набора данных;
Шаг 3: Выберите результаты из каждого набора данных импутации в соответствии с функцией оценки, чтобы получить окончательное значение импутации.
(f) фиктивное переменное заполнение
Если переменная является дискретной и имеет несколько различных значений, ее можно преобразовать в фиктивную переменную, например, переменная гендерного пола SEX имеет три разных значения мужского пола, семьи и NA, а столбец может быть преобразован в IS_SEX_MALE, IS_SEX_FEMALE и IS_SEX_NA. Если для переменной существует более дюжины различных значений, значения с меньшей частотой могут быть классифицированы как «другие» в соответствии с частотой каждого значения для уменьшения размерности. Эта практика максимизирует сохраняемую переменную информацию.
Код
sex_list = ['MALE', 'FEMALE', np.NaN, 'FEMALE', 'FEMALE', np.NaN, 'MALE']
df = pd.DataFrame({'SEX': sex_list})
display(df)
df.fillna('NA', inplace=True)
df = pd.get_dummies(df['SEX'],prefix='IS_SEX')
display(df)
# 原始数据
SEX
0 MALE
1 FEMALE
2 NaN
3 FEMALE
4 FEMALE
5 NaN
6 MALE
# 填充后
IS_SEX_FEMALE IS_SEX_MALE IS_SEX_NA
0 0 1 0
1 1 0 0
2 0 0 1
3 1 0 0
4 1 0 0
5 0 0 1
6 0 1
(g) Когда более 80% собственных значений отсутствуют, рекомендуется удалить [или стать переменной или нет], что легко повлияет на модельный эффект
df_titanic.drop(["deck"],axis=1)
2.3 Обработка исключений:
1) Идентификация выброса
- прямоугольный метод
sns.catplot(y="fare",x="survived", kind="box", data=df_titanic,palette="Set2");
- нормальное распределение
sns.distplot(df_titanic.age)
- Методы обнаружения выбросов
(а) На основе статистического анализа
Обычно пользователь моделирует точки данных с определенным статистическим распределением, а затем использует предполагаемую модель, чтобы определить, являются ли точки аномальными или нет в соответствии с распределением точек.
Например, анализируя расхождение статистических данных, то есть индекс вариации данных, мы можем понять распределение данных, а затем использовать индекс вариации данных, чтобы найти выбросы в данных.
Обычно используемые индикаторы вариации данных включают диапазон, межквартильный диапазон, среднее отклонение, стандартное отклонение, коэффициент вариации и т. д. Например, большое значение индикатора вариации указывает на большую вариацию и широкий разброс;
Например, по максимальному и минимальному значениям можно судить о том, превышает ли значение этой переменной разумный диапазон, например, возраст клиента составляет -20 или 200 лет, что является ненормальным значением.
(б) принцип 3σ
Если данные распределены нормально, по принципу 3σ выбросом является значение в наборе измеренных значений, которое отклоняется от среднего значения более чем на 3 стандартных отклонения. Если данные следуют нормальному распределению, вероятность возникновения значения, отличного от 3σ от среднего, составляет P(|x - μ| > 3σ)
(c) Анализ блочной диаграммы
Блочные диаграммы предоставляют критерий для выявления выбросов: если значение меньше Q1-1,5IQR или больше Q3+1,5IQR, оно называется выбросом.
Q1 — нижний квартиль, указывающий, что четверть всех наблюдений имеет меньшее значение данных;
Q4 — верхний квартиль, что означает, что четверть всех наблюдений имеет значение больше него;
IQR представляет собой межквартильный размах, представляющий собой разницу между верхним квартилем Q1 и нижним квартилем Q3 и содержащий половину всех наблюдений.
Метод ящичной диаграммы для оценки выбросов основан на квартилях и межквартильных диапазонах, а квартили являются надежными: 25% данных могут быть сколь угодно далекими и не будут мешать квартилям, поэтому аномальные значения не могут повлиять на этот критерий. Таким образом, ящичные диаграммы более объективны при выявлении выбросов и имеют определенные преимущества при выявлении выбросов.
(d) Проверка на основе модели
Сначала создайте модель данных.Аномалии — это объекты, которые не могут быть идеально подобраны моделью; если модель представляет собой набор кластеров, аномалии — это объекты, которые существенно не принадлежат ни к одному кластеру; при использовании регрессионной модели аномалии — это объекты, которые относительно далеко от прогнозируемого значения.
преимущество:
Имея прочную основу статистической теории, эти тесты могут быть очень эффективными при наличии достаточного количества данных и знаний о типе используемых тестов.
недостаток:
Для многомерных данных доступно меньше вариантов, а для многомерных данных эти возможности обнаружения плохи.
(e) на основе расстояния
Методы на основе расстояния основаны на предположении, что объект данных является аномалией, если он находится далеко от большинства точек. При определении меры близости между объектами в соответствии с расстоянием, позволяющим судить о том, находится ли аномальный объект далеко от других объектов, основными методами измерения расстояния являются абсолютное расстояние (манхэттенское расстояние), евклидово расстояние и расстояние Махаланобиса.
преимущество:
Методы, основанные на расстоянии, намного проще, чем методы, основанные на статистике;
Потому что определить метрику расстояния для набора данных намного проще, чем определить распределение набора данных.
недостаток:
Методы на основе близости требуют времени O(m2) и не подходят для больших наборов данных;
Метод также чувствителен к выбору параметров;
Не может обрабатывать наборы данных с областями разной плотности, так как использует глобальный порог, который не может учитывать изменения таких плотностей.
(f) Плотность на основе
Исследуя плотность вокруг текущей точки, мы можем найти локальные выбросы, локальная плотность выбросов значительно ниже, чем у большинства ближайших точек, что подходит для неоднородных наборов данных.
преимущество:
Дана количественная мера того, что объект является выбросом и хорошо обрабатывается, даже если данные имеют отдельные области.
недостаток:
Как и методы, основанные на расстоянии, эти методы обязательно имеют временную сложность O(m2).
Использование определенных структур данных для низкоразмерных данных может обеспечить O(mlogm);
Выбор параметров затруднен.
Хотя алгоритм решает эту проблему, просматривая различные значения k для получения максимальной оценки выброса, все же необходимо выбрать верхнюю и нижнюю границы для этих значений.
(g) На основе кластеризации
Считается ли объект выбросом, может зависеть от количества кластеров (например, шумных кластеров, когда k велико). На этот вопрос также нет простого ответа. Одна из стратегий заключается в повторении анализа для разного количества кластеров. Другой способ — найти много маленьких кластеров, идея такова:
Меньшие кластеры, как правило, более сплочены;
Если объект является выбросом при наличии большого количества небольших кластеров, он, вероятно, является истинным выбросом.
Недостатком является то, что набор выбросов может образовывать небольшие кластеры и ускользать от обнаружения.
преимущество:
Методы кластеризации, основанные на линейной и близкой к линейной сложности (k-means), могут быть очень эффективными для поиска выбросов;
Определение кластера обычно является дополнением к выбросу, поэтому можно найти как кластер, так и выброс.
недостаток:
Результирующий набор выбросов и их оценки могут сильно зависеть от количества используемых кластеров и наличия выбросов в данных;
Качество кластеров, создаваемых алгоритмом кластеризации, оказывает большое влияние на качество выбросов, создаваемых алгоритмом.
(h) Обнаружение выбросов на основе близости
Объект является аномальным, если он находится далеко от большинства точек. Этот метод является более общим и более простым в использовании, чем статистические методы, поскольку легче определить значимую меру близости для набора данных, чем определить его статистическое распределение. Оценка выброса объекта определяется расстоянием до его k-ближайших соседей. Оценки выбросов очень чувствительны к значению k. Если k слишком мало (например, 1), небольшое количество соседних выбросов может привести к аномально низким показателям выбросов; если K слишком велико, все объекты в кластерах с менее чем k точками могут стать выбросами. Чтобы сделать схему более устойчивой к выбору k, можно использовать среднее расстояние k ближайших соседей.
преимущество:
Простой
недостаток:
Методы на основе близости требуют времени O(m2) и не подходят для больших наборов данных;
Метод также чувствителен к выбору параметров;
Не может обрабатывать наборы данных с областями разной плотности, так как использует глобальный порог, который не может учитывать изменения таких плотностей.
Суммировать:
На этапе обработки данных выбросы рассматриваются как выбросы, влияющие на качество данных, а не как так называемые целевые точки для обнаружения выбросов.Как правило, для оценки выбросов переменных используется более простой и интуитивно понятный метод, сочетающий статистический метод прямоугольная диаграмма и групповая точка MAD.
sns.scatterplot(x="fare", y="age", hue="survived",data=df_titanic,palette="Set1")
2) Метод обработки
Обработка выбросов требует специального анализа конкретных ситуаций.Существует четыре широко используемых метода обработки выбросов:
- Удалить записи с выбросами;
- Являются ли некоторые из отфильтрованных аномальных образцов действительно ненужными аномальными образцами, лучше всего выяснить, понимаете ли вы бизнес, а затем подтвердить, чтобы мы не смогли отфильтровать нормальные образцы.
- Считать выбросы отсутствующими значениями и передавать их методу обработки отсутствующих значений;
- Используйте среднее/медиану/моду для исправления;
- Не обработан.
Три, характерная структура
3.1Особенности строительства
ЦельЭто должно улучшить представление данных и добавить предварительные знания.
Если эффект все еще не очень удовлетворительный после того, как мы обработали переменные, нам нужно построить признаки, то есть вывести новые переменные.
3.3.1Статистическая конструкция:
-
Создавайте новые функции на основе бизнес-правил, предыдущих знаний и т. д.
-
Квартиль, Медиана, Среднее, Стандартное отклонение, Отклонение, Асимметрия, Асимметрия, Дискретная система
-
Построить долгосрочную и краткосрочную статистику (например, недели, месяцы)
-
Распад времени (чем ближе наблюдение, тем выше значение веса)
- возрастная группа: ребенок, молодой, средний возраст, старый
def age_bin(x):
if x <= 18:
return 'child'
elif x <= 30:
return 'young'
elif x <= 55:
return 'midlife'
else:
return 'old'
df_titanic['age_bin'] = df_titanic['age'].map(age_bin)
df_titanic['age_bin'].unique()
执行结果:
array(['young', 'midlife', 'child', 'old'], dtype=object)
- Извлечь функции заголовка
df_titanic['title'] = df_titanic['name'].map(
lambda x: x.split(',')[1].split('.')[0].strip())
df_titanic['title'].value_counts()
执行结果:
Mr 757
Miss 260
Mrs 197
Master 61
Rev 8
Dr 8
Col 4
Ms 2
Major 2
Mlle 2
Dona 1
Sir 1
Capt 1
Don 1
Lady 1
Mme 1
the Countess 1
Jonkheer 1
# 再根据这些 title 细分,是官员,还是皇室,还是女士、先生、小姐
df_titanic['title'].unique()
执行结果:
array(['Mr', 'Mrs', 'Miss', 'Master', 'Don', 'Rev', 'Dr', 'Mme', 'Ms',
'Major', 'Lady', 'Sir', 'Mlle', 'Col', 'Capt', 'the Countess',
'Jonkheer', 'Dona'], dtype=object)
title_dictionary = {
"Mr": "Mr",
"Mrs": "Mrs",
"Miss": "Miss",
"Master": "Master",
"Don": "Royalty",
"Rev": "Officer",
"Dr": "Officer",
"Mme": "Mrs",
"Ms": "Mrs",
"Major": "Officer",
"Lady": "Royalty",
"Sir": "Royalty",
"Mlle": "Miss",
"Col": "Officer",
"Capt": "Officer",
"the Countess": "Royalty",
"Jonkheer": "Royalty",
"Dona": 'Mrs'
}
df_titanic['title'] = df_titanic['title'].map(title_dictionary)
df_titanic['title'].value_counts()
执行结果:
Mr 757
Miss 262
Mrs 201
Master 61
Officer 23
Royalty 5
- Извлечь размер семьи
df_titanic['family_size'] = df_titanic['sibsp'] + df_titanic['parch'] + 1
df_titanic['family_size'].head()
执行结果:
0 2
1 2
2 1
3 2
4 1
3.3.2 Значение периода:
-
Значения периода для первых n периодов/дней/месяцев/лет, например квантили за последние 5 дней, среднее значение и т. д.
-
г/г/м/м
3.3.3 Сегментирование данных:
1) Одинаковая частота и равное расстояние
(a) Индивидуальная группировка
Относится к самостоятельной установке и разделению интервалов на основе бизнес-опыта или здравого смысла, а затем к классификации необработанных данных по каждому интервалу.
(b) Равноудаленное бинирование
Разделите данные на равные части одинаковой ширины.
От минимального значения до максимального значения он делится на равные части N. Таким образом, если A и B являются минимальным и максимальным значением, то длина каждого интервала равна W = (B−A)/N, и граничное значение интервала равно A +W,A+2W,….A+(N−1)W . Здесь рассматривается только граница, и количество экземпляров в каждой аликвоте может варьироваться.
Недостатком является то, что на него сильно влияют выбросы.
(c) Равночастотное бинирование
Разделите данные на несколько равных частей, и количество данных в каждой равной части будет одинаковым.
Граничные значения интервалов выбираются таким образом, чтобы каждый интервал содержал примерно равное количество экземпляров. Скажем, N=10 , каждый интервал должен содержать около 10% экземпляров.
- Биннинг числовых переменных
# qcut 等频率分箱
df_titanic['fare_bin'], bins = pd.qcut(df_titanic['fare'], 5, retbins=True)
df_titanic['fare_bin'].value_counts()
(7.854, 10.5] 184
(21.679, 39.688] 180
(-0.001, 7.854] 179
(39.688, 512.329] 176
(10.5, 21.679] 172
bins #array([ 0. , 7.8542, 10.5 , 21.6792, 39.6875, 512.3292])
def fare_cut(age):
if age <= 7.8958:
return 0
if age <= 10.5:
return 1
if age <= 21.6792:
return 2
if age <= 39.6875:
return 3
return 4
df_titanic['fare_bin'] = df_titanic['fare'].map(fare_cut)
# cut 等距离分箱
bins = [0, 12, 18, 65, 100]
pd.cut(df_titanic['age'], bins).value_counts
2) Ковш Бест-КС
1. Отсортируйте собственные значения от меньшего к большему.
2. Рассчитайте максимальное значение KS, которое является точкой касания, обозначенной как D. Затем разделите данные на две части.
3. Повторите шаг 2, выполните рекурсию и дополнительно обрежьте данные вокруг D. Пока количество шкафов КС не достигнет заданного нами порога.
4. Непрерывные переменные: значение KS после бинирования
5. В процессе бинирования значение KS после бинирования определяется как определенная точка отсечки, а не совместное действие нескольких точек отсечки. Положение этой точки касания является положением, в котором исходное значение KS является максимальным.
Примечание. Пожалуйста, проверьте реализацию кода в Интернете.
3) ведро хи-квадрат
Восходящие (т. е. основанные на слиянии) методы дискретизации данных. Он основан на тесте хи-квадрат: соседние интервалы с наименьшим значением хи-квадрат объединяются вместе до тех пор, пока не будет выполнен определенный критерий остановки.
Основная идея
Для точной дискретизации относительные частоты классов должны точно совпадать в интервале. Таким образом, два соседних интервала могут быть объединены, если они имеют очень похожие распределения классов, в противном случае они должны оставаться отдельными. Принимая во внимание, что низкие значения хи-квадрат указывают на то, что они имеют схожие распределения классов.
Этапы реализации
Шаг 1: Предварительно определите пороговое значение хи-квадрат;
Шаг 2: Инициализация, сортировка экземпляров по атрибутам, чтобы они были дискретными, каждый экземпляр принадлежит интервалу;
Шаг 3: Объедините интервал;
Вычислить значение хи-квадрат для каждой пары соседних интервалов;
Объедините пару интервалов с наименьшим значением хи-квадрат;
Aij: количество экземпляров j-го класса в i-м интервале Eij: ожидаемая частота Aij (=(Ni*Cj)/N), где N — общее количество отсчетов, Ni — количество отсчетов в i-м интервале. i-я группа, а Cj — j-й класс, доля выборки в генеральной совокупности;
Значение порога
Когда категории и атрибуты независимы, существует 90%-ная вероятность того, что вычисленное значение хи-квадрат будет меньше 4,6. Значение хи-квадрат выше порогового значения 4,6 указывает на то, что атрибуты и классы не являются независимыми друг от друга и не могут быть объединены. Если порог выбран большим, объединение интервалов будет выполняться много раз, и количество дискретных интервалов мало, а интервал велик.
Уведомление
Алгоритм ChiMerge рекомендует использовать доверительные интервалы 0,90, 0,95 и 0,99, максимальное количество интервалов от 10 до 15, порог хи-квадрат также можно не учитывать, в этом случае минимальное количество интервалов или максимальное количество можно рассматривать интервалы. Укажите верхний и нижний пределы количества интервалов, максимум несколько интервалов и хотя бы несколько интервалов, для категориальных переменных требуется сортировка определенным образом, когда требуется бинирование.
Код
3) Биннинг методом минимальной энтропии
Суммарное значение энтропии необходимо минимизировать, то есть биннинг позволяет в наибольшей степени различать категории зависимой переменной.
Энтропия является мерой степени беспорядка данных в теории информации.Основная цель предложения информационной энтропии состоит в том, чтобы выяснить связь между количеством информации и избыточностью определенной системы символов, так что наибольшая эффективность может быть достигнута с помощью наименьшие затраты и потребление Хранение данных, управление и доставка.
Чем ниже энтропия набора данных, тем меньше разница между данными, минимальное деление энтропии должно обеспечить наилучшее сходство данных в каждом блоке. Учитывая количество бинов, если рассмотреть все возможные ситуации бинирования, бин, полученный методом минимальной энтропии, должен быть бином с наименьшей энтропией.
3.3.4 Комбинации функций
Примечание: ограниченное рассмотрение размеров сильных элементов
1) Дискретный + Дискретный: Декартово произведение
2) Дискретный + непрерывный: Декартово произведение после непрерывного разделения функций или группировки на основе признаков категории, аналогично построению кластерных признаков.
3) Непрерывный + Непрерывный: сложение, вычитание, умножение и деление, разность второго порядка и т.д.
- Новые функции генерации полиномов [для непрерывных значений]
df_titanic_numerical = df_titanic[['age','sibsp','parch','fare','family_size']]
df_titanic_numerical.head()
执行结果:
age sibsp parch fare family_size
0 22.0 1 0 7.2500 2
1 38.0 1 0 71.2833 2
2 26.0 0 0 7.9250 1
3 35.0 1 0 53.1000 2
4 35.0 0 0 8.0500 1
# 扩展数值特征
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False, interaction_only=False)
df_titanic_numerical_poly = poly.fit_transform(df_titanic_numerical)
pd.DataFrame(df_titanic_numerical_poly, columns=poly.get_feature_names()).hea
Проверьте корреляцию после получения новой переменной, чем темнее цвет, тем больше корреляция:
sns.heatmap(pd.DataFrame(df_titanic_numerical_poly, columns=poly.get_feature_names()).corr())
3.4 Выбор функций
Цельзаключается в уменьшении шума, возможности плавного прогнозирования и вычислительной сложности, а также в повышении производительности прогнозирования модели.
После завершения предварительной обработки данных нам нужно выбрать значимые функции для ввода в алгоритмы и модели машинного обучения для обучения.
Вообще говоря, функции выбираются из двух аспектов:
- Является ли функция расходящейся: Если признак не расходится, например, дисперсия близка к 0, то есть образцы практически не различаются по этому признаку, и этот признак бесполезен для различения образцов.
- корреляция функции и цели: это очевидно, и следует отдавать предпочтение функциям с высокой корреляцией с целью. За исключением метода дисперсии, все другие методы, представленные в этой статье, рассматриваются на основе корреляции.
По форме выбора признаков методы выбора признаков можно разделить на три типа:
- Filter: метод фильтрации, согласноДивергенцияилиКорреляцияОцените каждую функцию, установитеПорог или порог, который необходимо выбратьчисло для выбора функций.
- Wrapper: метод переноса, в соответствии с целевой функцией (обычно оценка эффекта прогнозирования), каждый раз выбираются или исключаются несколько функций.
- Embedded: метод встраивания, сначала используйте некоторые алгоритмы и модели машинного обучения для обучения, получите весовые коэффициенты каждой функции и выберите функции от больших до малых в соответствии с коэффициентами. Аналогичен методу «Фильтр», но с помощью обучения для определения плюсов и минусов функций. Мы используем библиотеку feature_selection в sklearn для выбора функций.
3.4.1 Отфильтровано
1) Фильтрация отклонений
Это класс для фильтрации объектов по их собственной дисперсии. Например, дисперсия самого признака мала, а это значит, что разницы между выборками по этому признаку в принципе нет, может быть, большая часть значений у признака одинакова, или даже значение весь признак одинаков, тогда этот признак не влияет на различение выборки. Поэтому независимо от того, что будет делать следующая разработка признаков, мы должны сначала исключить признаки с нулевой дисперсией. VarianceThreshold имеет важный параметр threshold, который представляет собой порог дисперсии, что означает, что все признаки с дисперсией меньше порога отбрасываются.Если не заполнено, значение по умолчанию равно 0, то есть удаляются все записи с одинаковым признаком.
from sklearn.feature_selection import VarianceThreshold
variancethreshold = VarianceThreshold() #实例化,默认方差为 0.方差<=0 的过滤掉
df_titanic_numerical = df_titanic[['age','sibsp','parch','fare','family_size']]
X_var = variancethreshold.fit_transform(df_titanic_numerical) #获取删除不合格特征后的新特征矩阵
variancethreshold.variances_
array([ 79.58,1.21467827,0.64899903,512.3292,2.60032675])
del_list = df_titanic_numerical.columns[variancethreshold.get_support()==0].to_list() #获得删除
Однако дисперсия также может помочь нам сделать выбор функций за один шаг, если мы знаем, сколько функций нам нужно.
Например, если мы хотим сохранить половину признаков, мы можем установить порог дисперсии, который делит общее количество признаков наполовину, просто найдите медиану дисперсии признаков, а затем добавьте этомедианаПросто введите его как значение порога параметра:
df_titanic_numerical_fsvar = VarianceThreshold(np.median(df_titanic_numerical.var().values)).fit_transform(df_titanic_numerical)
Когда признак является двухкатегорийным, значением признака является случайная вариация Бернулли, предполагая, что p = 0,8, то есть, когда определенная категория в признаке с двумя категориями составляет более 80%, удалить признак
X_bvar = VarianceThreshold(.8 * (1 - .8)).fit_transform(df_titanic_numerical)
X_bvar.shape
执行结果:
(891, 5)
2) фильтрация хи-квадрат
Тест хи-квадрат, предназначенный для алгоритмов классификации, фиксирует корреляции, отслеживает признаки с p меньше уровня значимости.
Фильтрация хи-квадрат специально разработана дляДискретные метки (например, проблемы классификации) корреляционная фильтрация.
Класс теста хи-квадратfeature_selection.chi2рассчитать каждыймежду неотрицательными функциями и меткамиСтатистика хи-квадрат и ранжирование по характеристикам от высокого к низкому
df_titanic_categorical = df_titanic[['sex', 'class', 'embarked', 'who', 'age_bin','adult_male','alone','fare_bin']]
df_titanic_numerical = df_titanic[['age','sibsp','parch','fare','family_size','pclass']]
df_titanic_categorical_one_hot = pd.get_dummies(
df_titanic_categorical,
columns=['sex', 'class', 'embarked', 'who', 'age_bin','adult_male','alone','fare_bin'],
drop_first=True)
df_titanic_combined = pd.concat([df_titanic_numerical,df_titanic_categorical_one_hot],axis=1)
y = df_titanic['survived']
X = df_titanic_combined.iloc[:,1:]
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest
chi_value, p_value = chi2(X,y)
#根据 p 值,得出 k 值
k = chi_value.shape[0] - (p_value > 0.05).sum() #要保留的特征的数量 14
#根据卡方值,选择前几特征,筛选后特征
X_chi = SelectKBest(chi2, k=14).fit_transform(X, y)
X_chi.shape
(89
3) F-тест
Могут быть зафиксированы только линейные корреляции, данные должны подчиняться нормальному распределению, а значение P меньше уровня значимости.
F-тест, также известный как ANOVA, тест на однородность дисперсии, представляет собой метод фильтрации, используемый для определения линейной зависимости между каждой функцией и меткой. Он может выполнять как регрессию, так и классификацию, поэтому содержит два класса: feature_selection.f_classif (классификация F-теста) и feature_selection.f_regression (регрессия F-теста). Где классификация F-теста используется для данных, метки которых являются дискретными переменными, а регрессия F-теста используется для данных, метки которых являются непрерывными переменными.
Суть F-теста состоит в том, чтобы найти линейную связь между двумя наборами данных, а его нулевая гипотеза состоит в том, что «между данными нет существенной линейной зависимости».
from sklearn.feature_selection import f_classif
f_value, p_value = f_classif(X,y)
#根据 p 值,得出 k 值
k = f_value.shape[0] - (p_value > 0.05).sum()
#筛选后特征
X_classif = SelectKBest(f_classif, k=14).fit_transform(X, y)
4) Закон о взаимной информации
Может зафиксировать любую корреляцию. Не может использоваться для разреженных матриц, отслеживая признаки с взаимной информацией больше 0.
Метод взаимной информации используется для захвата произвольной связи между каждой функцией и меткой (Включая линейные и нелинейные отношения) метод фильтрации. Подобно F-тесту, его можно использовать как для регрессии, так и для классификации, и он включает два класса:
feature_selection.mutual_info_classif (классификация взаимной информации) feature_selection.mutual_info_regression (регрессия взаимной информации)
Использование и параметры этих двух классов точно такие же, как у F-теста, но метод взаимной информации более мощный, чем F-тест. отношения. Метод взаимной информации не возвращает статистику, аналогичную p-значению или F-значению, он возвращает «оценку количества взаимной информации между каждым признаком и целью», эта оценка принимает значение между [0,1], если он равен 0, то Указывает, что две переменные независимы, а значение 1 указывает, что две переменные полностью коррелированы.
from sklearn.feature_selection import mutual_info_classif as MIC
#互信息法
mic_result = MIC(X,y) #互信息量估计
k = mic_result.shape[0] - sum(mic_result <= 0) #16
X_mic = SelectKBest(MIC, k=16).fit_transform(X, y)
X_mic.shape
(891, 16)
3.4.2 Завернутый
1) Метод исключения рекурсивных признаков
Метод рекурсивного исключения признаков использует базовую модель для нескольких раундов обучения.После каждого раунда обучения исключаются признаки нескольких весовых коэффициентов, а затем выполняется следующий раунд обучения на основе нового набора признаков. Код для выбора объектов с использованием класса RFE библиотеки feature_selection выглядит следующим образом:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数 estimator 为基模型
#参数 n_features_to_select 为选择的特征个数
X_ref = RFE(estimator=LogisticRegression(), n_features_to_select=10).fit_transform(X, y)
2) Оценка существенности
from sklearn.ensemble import ExtraTreesClassifier
# feature extraction
model = ExtraTreesClassifier()
model.fit(X, y)
print(model.feature_importances_)
feature=list(zip(X.columns,model.feature_importances_))
feature=pd.DataFrame(feature,columns=['feature','importances'])
feature.sort_values(by='importances',ascending=False).head(20)
feature importances
2 fare 0.227659
15 adult_male_True 0.130000
10 who_man 0.108939
5 sex_male 0.078065
11 who_woman 0.059090
7 class_Third 0.055755
4 pclass 0.048733
3 family_size 0.038347
0 sibsp 0.035489
9 embarked_S 0.029512
1 parch 0.023778
20 fare_bin_(39.688, 512.329] 0.022985
14 age_bin_young 0.021404
12 age_bin_midlife 0.019379
6 class_Second 0.019301
17 fare_bin_(7.854, 10.5] 0.016448
19 fare_bin_(21.679, 39.688] 0.016006
18 fare_bin_(10.5, 21.679] 0.014871
16 alone_True 0.013093
13 age_bin_old 0.0112
3) Оценка важности ранжирования
**Плюсы:** быстрые вычисления, простота использования и понимания, свойства мер важности функций, стремление к стабильности функций.
**Обоснование.** Важность перестановки рассчитывается после обучения модели машинного обучения. Этот подход представляет модели гипотезу о том, насколько сильно это повлияет на точность модели прогнозирующего машинного обучения, если один столбец данных функций набора проверки будет случайным образом перетасован при сохранении целевого и всех других столбцов. Для функции высокой важности случайное перетасовка может нанести больший ущерб точности прогнозов модели машинного обучения.
**Интерпретация результатов: **Первое число в каждой строке указывает, насколько снижается производительность модели (в примере используется коэффициент точности), а числа после ± указывают стандартное отклонение множественных нарушений.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import eli5
from eli5.sklearn import PermutationImportance
my_model = RandomForestClassifier(random_state=0).fit(train_X, train_y)
perm = PermutationImportance(my_model, random_state=1).fit(val_X, val_y)
eli5.show_weights(perm, feature_names = val_X.columns.tolist())
3.4.3 Встроенный
1) Метод выбора признаков на основе условий штрафа
Используя базовую модель со штрафными условиями, кроме отсеивания признаков, также выполняется уменьшение размерности.
Используя класс SelectFromModel библиотеки feature_selection в сочетании с моделью логистической регрессии со штрафным термином L1, код для выбора функций выглядит следующим образом:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#带 L1 和 L2 惩罚项的逻辑回归作为基模型的特征选择,这个设置带 L1 惩罚项的逻辑回归作为基模型的特征选择
lr = LogisticRegression(solver='liblinear',penalty="l1", C=0.1)
X_sfm = SelectFromModel(lr).fit_transform(X, y)
X_sfm.shape
(891, 7
Используя класс SelectFromModel библиотеки feature_selection в сочетании с моделью SVM, код для выбора признаков выглядит следующим образом:
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC
lsvc = LinearSVC(C=0.01,penalty='l1',dual=False).fit(X, y)
model = SelectFromModel(lsvc,prefit=True)
X_sfm_svm = model.transform(X)
X_sfm_svm.shape
(891, 7
2) На основе модели дерева
GBDT в древовидной модели также можно использовать в качестве базовой модели для выбора функций.Используя класс SelectFromModel библиотеки feature_selection в сочетании с моделью GBDT, код для выбора функций выглядит следующим образом:
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT 作为基模型的特征选择
gbdt = GradientBoostingClassifier()
X_sfm_gbdt = SelectFromModel(gbdt).fit_transform(X, y)
X_sfm_gbdt.shape
(891, 5)
Подводя итог, можно сказать, что существует несколько методов и способов выбора признаков:
(1) Если функция является категориальной переменной, вы можете начать с SelectKBest и использовать хи-квадрат или древовидный селектор для выбора переменной;
(2) Если признак является количественной переменной, для прямого выбора переменной можно использовать линейную модель и селектор на основе корреляции;
(3) Если это проблема двоичной классификации, вы можете рассмотреть возможность использования SelectFromModel и SVC;
(4) Прежде чем выполнять выбор функции, все равно необходимо выполнить EDA.
В-четвертых, преобразование функций
1) Стандартизация
Преобразуйте в Z-оценку, чтобы столбец числовых признаков имел среднее арифметическое 0 и дисперсию (и стандартное отклонение) 1. Не иммунный выброс.
Примечание: если в столбце числовых признаков (найденных EDA) есть численно большие или малые выбросы, следует использовать более надежную статистику: используйтемедианаВместо среднего арифметического используйтеквантиль(квантиль) вместо дисперсии. Этот метод нормализации имеет важный параметр: (нижний квантиль, верхний квантиль), который лучше всего определяется визуализацией данных с помощью EDA. Иммунный выброс.
from sklearn.preprocessing import StandardScale
#标准化模型训练
Stan_scaler = StandardScaler()
Stan_scaler.fit(x)
x_zscore = Stan_scaler.transform(x)
x_test_zscore = Stan_scaler.transform(x_test)
joblib.dump(Stan_scaler,'zscore.m') #写入文件
2) Нормализация
Нормализуйте каждую строку данных так, чтобы она имела единичную норму, а тип нормы мог быть l1, l2 или max. Не иммунный выброс.
,в\iota представляет функцию нормы.
3) Интервальное масштабирование (масштабирование)
Разделите значение столбца на максимальное абсолютное значение столбца.
MinMaxScaler: линейно сопоставляется с [0, 1] , не застрахован от выбросов.
MaxAbsScaler: линейно сопоставляется с [-1, 1] , не застрахован от выбросов.
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
min_max_scaler.fit_transform(x)
x_minmax = min_max_scaler.transform(x)
x_test_minmax = min_max_scaler.transform(x_test)
joblib.dump(min_max_scaler,'min_max_scaler.m') #写入文件
Примечание: если в столбце числовых признаков (найденных EDA) есть численно большие или малые выбросы, следует использовать более надежную статистику: используйтемедианаВместо среднего арифметического используйтеквантиль(квантиль) вместо дисперсии. Этот метод нормализации имеет важный параметр: (нижний квантиль, верхний квантиль), который лучше всего определяется визуализацией данных с помощью EDA. Иммунный выброс.
Разница между нормализацией и нормализацией
(a) Цель другая, нормализация состоит в том, чтобы устранить сжатие размерности до интервала [0,1]; нормализация просто корректирует общее распределение признаков. (b) Нормализация связана с максимальным и минимальным значениями, стандартизация связана со средним значением и стандартным отклонением. (c) Нормализованный выход находится в пределах [0,1], нормализация не ограничена.
Сценарии применения нормализации и стандартизации
(a) В алгоритмах классификации и кластеризации, когда для измерения подобия требуется расстояние (например, SVM, KNN) или когда технология PCA используется для уменьшения размерности, стандартизация Z-оценки работает лучше. (b) Первый метод или другие методы нормализации могут использоваться, когда не используются мера расстояния, расчет ковариации и данные, не соответствующие нормальному распределению. Например, при обработке изображений после преобразования изображения RGB в изображение в градациях серого его значение ограничивается диапазоном [0 255]. (c) Методы на основе дерева не требуют нормализации признаков. НапримерСлучайный лес, бэггинг и бустинги другие методы. Если это модель на основе параметров или модель на основе расстояний, требуется нормализация, поскольку необходимо рассчитать параметры или расстояния.
3.5.2 Нелинейное преобразование [статистическое преобразование]
Используйте статистические или математические преобразования, чтобы смягчить последствия неравномерного распределения данных. Значения исходно плотного интервала максимально разбросаны, а значения исходно рассредоточенного интервала максимально агрегированы.
Эти функции преобразования относятся к семейству функций преобразования мощности и часто используются для создания монотонных преобразований данных. Их основная роль заключается в том, что они помогают стабилизировать дисперсию, всегда сохраняя распределение близким к нормальному распределению и делая данные независимыми от среднего значения распределения.
1) преобразование журнала
Преобразование журнала часто используется для создания монотонных преобразований данных. Его основная функция – помогатьСтабильная дисперсия, всегда сохраняя распределение близким кнормальное распределениеИ сделать данные независимыми от среднего значения распределения. Поскольку логарифмическое преобразование имеет тенденцию растягивать диапазон значений независимых переменных, которые попадают в более низкий диапазон амплитуд, оно имеет тенденцию сжимать или уменьшать диапазон значений независимых переменных, которые попадают в более высокий диапазон амплитуд. Это делает асимметричное распределение максимально близким к нормальному распределению. Следовательно, для нестабильности дисперсии некоторых числовых непрерывных признаков и распределения собственных значений с тяжелыми хвостами нам необходимо использовать логизацию для корректировки дисперсии всего распределения данных, что представляет собой устойчивое к дисперсии преобразование данных.
Преобразование журнала принадлежитСемейство функций преобразования мощности. Функция выражается математически как
Натуральный логарифм использует b=e, e=2,71828, часто называемую константой Эйлера. Вы можете использовать b=10 как основу, обычно используемую в десятичной системе.
Код
sns.distplot(df_titanic.fare,kde=False)
df_titanic['fare_log'] = np.log((1+df_titanic['fare']))
sns.distplot(df_titanic.fare_log,kde=False)
2) преобразование бокса-кокса
Преобразование Бокса-Кокса — это функция из другого популярного семейства функций степенного преобразования. Функция имеет предварительное условие, а именноЧисловые значения необходимо сначала преобразовать в положительные числа(как того требует преобразование журнала). В случае отрицательного значения полезно использовать константу для смещения значения.
Преобразование бокса-кокса представляет собой обобщенный метод преобразования мощности, предложенный бокс и кокс в 1964 году. Это преобразование данных обычно используется в статистическом моделировании.Непрерывная переменная отклика не удовлетворяет нормальному распределениюСлучай. После преобразования бокса-кокса ненаблюдаемая ошибка и корреляция переменных-предикторов могут быть в определенной степени уменьшены. Основная особенность преобразования Бокса-Кокса заключается во введении параметра, который оценивается через сами данные, чтобы определить форму преобразования данных, которую следует принять.Преобразование Бокса-Кокса может значительно улучшить качество данных.Нормальность, симметрия и равенство дисперсий, который хорошо работает со многими реальными данными.
box-coxФункция преобразования:
Результирующий преобразованный выход y является функцией входа x и параметров преобразования; когда λ = 0, преобразование является естественным логарифмическим преобразованием, как мы упоминали ранее. Оптимальное значение λ обычно определяется максимальным правдоподобием или максимальным логарифмическим правдоподобием.
Код
# 从数据分布中移除非零值
fare_positive_value = df_titanic[(~df_titanic['fare'].isnull()) & (df_titanic['fare']>0)]['fare']
import scipy.stats as spstats
# 计算最佳λ值
l, opt_lambda = spstats.boxcox(fare_positive_value)
print('Optimal lambda value:', opt_lambda) # -0.5239075895755266
# 进行 Box-Cox 变换
fare_boxcox_lambda_opt = spstats.boxcox(df_titanic[df_titanic['fare']>0]['fare'],lmbda=opt_lambda)
sns.distplot(fare_boxcox_lambda_opt,kde=Fal
3.5.3 Обработка дискретных переменных
1) Кодировщик этикеток
LabelEncoder правПрерывистые числа или текстчисло, закодированное значение находится между0 и n_классов-1между этикетками.
Например: такие как [собака, кошка, собака, мышь, кошка], мы преобразуем в [1, 2, 1, 3, 2]. Здесь происходит странное явление: среднее между собакой и мышью — это кошка.
преимущество: по сравнению с кодировкой OneHot кодировка LabelEncoder занимает меньше места в памяти и поддерживает кодировку текстовых функций.
недостаток: Это подразумевает предположение: между различными категориями существует отношение порядка. В конкретной реализации кода LabelEncoder сортирует все уникальные данные в столбце качественной характеристики один раз, чтобы получить сопоставление исходного ввода с целым числом. Поэтому широкого применения кодировка меток пока не нашла, и ее вообще можно использовать в древовидных моделях.
Код
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(["超一线", "一线", "二线", "三线"])
print('特征:{}'.format(list(le.classes_)))
# 输出 特征:['一线', '三线', '二线', '超一线']
print('转换标签值:{}'.format(le.transform(["超一线", "一线", "二线"])))
# 输出 转换标签值:array([3 0 2]...)
print('特征标签值反转:{}'.format(list(le.inverse_transform([2, 2, 1]))))
# 输出 特征标签值反转:['二线', '二线', '三线
2) Один горячий энкодер
OneHotEncoder используется для расширения измерения данных, представляющих классификацию. Простейшее понимание состоит в том, чтобы использовать N-битный регистр состояния для кодирования N состояний, каждое состояние имеет независимый бит регистра, и только один из этих битов регистра является действительным, и может быть только одно состояние.
Зачем использовать однократное кодирование?
Горячее кодирование связано с тем, что большинство алгоритмов вычисляются на основе метрик в векторных пространствах, так что значения переменных с отношениями нечастного порядка не имеют частичного порядка, а точки равноудалены. С помощью горячего кодирования значение дискретных признаков расширяется до евклидова пространства, а значение дискретного признака соответствует точке в евклидовом пространстве. Использование горячего кодирования для дискретных объектов делает расчет расстояния между объектами более разумным.
Почему собственные векторы отображаются в евклидово пространство?
Сопоставление дискретных объектов с евклидовым пространством с помощью горячего кодирования связано с тем, что в алгоритмах машинного обучения, таких как регрессия, классификация и кластеризация, очень важен расчет расстояния или сходства между объектами, и мы обычно используем расстояние или сходство. расчет подобия в евклидовом пространстве.
Например, допустим, есть три цветных признака: красный, желтый, синий.
При использовании алгоритмов машинного обучения обычно требуется векторизация или оцифровка. Затем вы можете предположить, что красный = 1, желтый = 2, синий = 3, тогда это реализует кодирование меток, то есть меток для разных категорий. Однако это означает, что машина может выучить «красный
Таким образом, кодировки этикетки в настоящее время недостаточно, и требуется дальнейшее преобразование. Поскольку существует три цветовых состояния, имеется 3 бита. То есть красный: 1 0 0, желтый: 0 1 0, синий: 0 0 1. Таким образом, расстояние между каждыми двумя векторами равно корневому числу 2, а расстояния в векторном пространстве равны, поэтому частичного порядка не будет, и эффект алгоритма измерения на основе векторного пространства не пострадает.
преимущество: Горячее кодирование решает проблему, заключающуюся в том, что классификатор плохо справляется с обработкой атрибутивных данных, а также в определенной степени играет роль расширения возможностей. Его значения только 0 и 1, а разные типы хранятся в вертикальном пространстве.
недостаток: он может только бинаризировать числовые переменные и не может напрямую кодировать категориальные переменные строкового типа. Когда количество категорий велико, пространство признаков может стать очень большим. В этом случае для уменьшения размерности обычно можно использовать PCA. И комбинация одного горячего кодирования+PCA тоже очень полезна на практике.
Код
- Реализовано с помощью панд:
sex_list = ['MALE', 'FEMALE', np.NaN, 'FEMALE', 'FEMALE', np.NaN, 'MALE']
df = pd.DataFrame({'SEX': sex_list})
display(df)
df.fillna('NA', inplace=True)
df = pd.get_dummies(df['SEX'],prefix='IS_SEX')
display(df)
# 原始数据
SEX
0 MALE
1 FEMALE
2 NaN
3 FEMALE
4 FEMALE
5 NaN
6 MALE
# 填充后
IS_SEX_FEMALE IS_SEX_MALE IS_SEX_NA
0 0 1 0
1 1 0 0
2 0 0 1
3 1 0 0
4 1 0 0
5 0 0 1
pd.get_dummies(
df_titanic,
columns=[
'sex', 'class', 'pclass', 'embarked', 'who', 'family_size', 'age_bin'
],drop_first=True)
- Реализовано с помощью sklearn:
注:当特征是字符串类型时,需要先用 LabelEncoder() 转换成连续的数值型变量,再用 OneHotEncoder() 二值化
sklearn.preprocessing 中的 OneHotEncoder 将 shape=(None,1)的列向量中每个分量表示的下标(index)编码成 one hot 行向量。
import numpy as np
from sklearn.preprocessing import OneHotEncoder
行向量转列向量:
# 非负整数表示的标签列表
labels = [0,1,0,2]
# 行向量转列向量
labels = np.array(labels).reshape(len(labels), -1)
one hot 编码:
enc = OneHotEncoder()
enc.fit(labels)
targets = enc.transform(labels).toarray()
# 如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定 sparse = False 来达到同样的效果
编码结果:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 1., 0., 0.],
[ 0., 0., 1.]])
3) МаркМетка Бинаризатор
Функция такая же, как OneHotEncoder, но OneHotEncoder может только бинаризировать числовые переменные и не может напрямую кодировать категориальные переменные строкового типа, в то время как LabelBinarizer может напрямую бинаризировать переменные символьного типа.
3.5.4 Уменьшение размерности
Чтение данных и отображение данных
from sklearn import datasets
iris_data = datasets.load_iris()
X = iris_data.data
y = iris_data.target
def draw_result(X, y):
"""
X: 降维后的数据
iris: 原数据
"""
plt.figure()
# 提取 Iris-setosa
setosa = X[y == 0]
# 绘制点:参数 1 x 向量,y 向量
plt.scatter(setosa[:, 0], setosa[:, 1], color="red", label="Iris-setosa")
# Iris-versicolor
versicolor = X[y == 1]
plt.scatter(versicolor[:, 0], versicolor[:, 1], color="orange", label="Iris-versicolor")
# Iris-virginica
virginica = X[y == 2]
plt.scatter(virginica[:, 0], virginica[:, 1], color="blue", label="Iris-virginica")
plt.legend()
plt.show()
draw_result(X, y
1) PCA (анализ основных компонентов)
Функция: уменьшение размерности, сжатие
шаг:
- попрошайничествоХ-означает
- будетX минус среднее значение для вычисления ковариационной матрицыC = \frac{1}{m}XX^T
- парная ковариационная матрицаC Разложение по собственным значениям
- Сортировать от большего к меньшемуСобственные значения C берутся передСобственные векторы, соответствующие k собственным значениям, образуют матрицу по строкам, которая является матрицей преобразованияP_{k\times n}
(a) Внедрение PCA вручную
class PCA:
def __init__(self, dimension, train_x):
# 降维后的维度
self.dimension = dimension
# 原始数据集
self.train_x = train_x
@property
def result(self):
'返回降维后的矩阵'
# 1. 数据中心化
data_centering = self.train_x - np.mean(self.train_x, axis=0)
# 2. 计算协方差矩阵
cov_matrix = np.cov(data_centering, rowvar=False)
# 3. 特征值分解
eigen_val, eigen_vec = np.linalg.eig(cov_matrix)
# 4. 生成降维后的数据
p = eigen_vec[:, 0:self.dimension] # 取特征向量矩阵的前 k 维
return np.dot(data_centering,p)
调用方法:
pca = PCA(2,X)
iris_2d = pca.result
draw_result(iris_2d, y
(b) PCA sklearn
import numpy as np
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newX = pca.fit_transform(X)
draw_result(newX, y)
2)SVD (разложение по единственному значению)
эффект: Декомпозиция признаков, уменьшение размерности
шаг:
(a) Вручную внедрить SVD
class SVD:
def __init__(self, dimension, train_x):
self.dimension = dimension
self.train_x = train_x
@property
def result(self):
'返回降维后的矩阵'
data_centering = self.train_x - np.mean(self.train_x, axis=0)
# SVD
U, Sigma, VT = np.linalg.svd(data_centering)
return np.dot(data_centering, np.transpose(VT)[:, :self.dimension])
调用方法:
svd = SVD(2,X)
iris_svd = svd.result
draw_result(iris_svd,y)
(б) SVD sklearn
TruncatedSVD, усеченная сингулярная декомпозиция (этот метод используется, когда количество данных очень велико и svd не может закончиться).
from sklearn.decomposition import TruncatedSVD
iris_2d = TruncatedSVD(2).fit_transform(X)
draw_result(iris_2d, y)
3)Связь ППШ и СВД
4) Fisher Линейный дискриминантный анализ(линейный дискриминантный анализ, LDA)
представляет собой контролируемое уменьшение размерности, которое позволяет получить оптимальное подмножество признаков путем минимизации дисперсии внутри класса и максимизации дисперсии между классами.
LD1 может хорошо разделять два класса, которые обычно распределяются по линейному определению. Линейное решение LD2 поддерживает большую дисперсию набора данных, но LD2 не может предоставить информацию о классе, поэтому LD2 не является хорошим линейным решением.
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA(n_components=2)
iris_2d = lda.fit_transform(X, y)
draw_result(iris_2d, y)
LDA похож на PCA:
PCA пытается найти ортогональную ось главного компонента с наибольшей дисперсией. LDA находит подпространство признаков, оптимизирующее классификацию. LDA и PCA — оба метода линейного преобразования, которые можно использовать для уменьшения размерности набора данных. PCA — алгоритм без учителя. LDA — превосходный метод извлечения признаков для классификации
5) T-SNE
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2)
iris_2d = tsne.fit_transform(X)
draw_result(iris_2d, y)
5 Резюме
Не делайте этого: если в начале добавить в модель все функции, легко ввести в заблуждение некоторые бесполезные функции.
1) EDA
заговор, заговор, заговор, важные вещи, сказанные трижды
2) Предварительная обработка признаков
последовательно: добавить вчерашнюю функцию к сегодняшней или добавить изменение значения функции по сравнению со вчерашним днем к сегодняшней функции.
Непрерывная дискретизация признаков(Модели типа дерева решений бессмысленны): очень интересный вариант — ограничить точность функций с плавающей запятой, аномальные данные обладают высокой надежностью, и модель будет более стабильной.
clipping: вы можете использовать метод .clip(low, upper) кадра данных pandas, чтобы ограничить значение собственных значений определенным диапазоном.
3) Очистка данных
Он должен быть разумным, а не слепо заполнять пропущенные значения или удалять выбросы, и должен основываться на статистических данных.
4) Преобразование функций
Без крайней необходимости не используйте PCA или LDA для уменьшения размерности, рекомендуется напрямую уменьшать исходные функции.
- Преобразование функций, чтобы запомнить:
Любое монотонное преобразование (например, логарифмирование) в столбцах отдельных признаков: неприменимо к древовидным алгоритмам принятия решений.
Для деревьев решенийНет никакой разницы между X, X^3, X^5,Нет никакой разницы между |X|, X^2, X^4, если только не возникает ошибка округления.
Линейная комбинация: Подходит только для деревьев решений и ансамблей, основанных на деревьях решений (таких как повышение градиента, случайный лес), потому что обычная функция разделения по оси плохо фиксирует корреляцию между различными функциями; не подходит для SVM, линейной регрессии, нейронных сетей. сети Подождите.
- Сочетание категориальных и числовых признаков:
N1 и N2 используются для представления числовых функций, а C1 и C2 используются для представления категориальных функций.Используя операцию groupby pandas, можно создать следующие значимые новые функции: (C2 также может быть дискретизирован N1)
median(N1)_by(C1) \\ 中位数
mean(N1)_by(C1) \\ 算术平均数
mode(N1)_by(C1) \\ 众数
min(N1)_by(C1) \\ 最小值
max(N1)_by(C1) \\ 最大值
std(N1)_by(C1) \\ 标准差
var(N1)_by(C1) \\ 方差
freq(C2)_by(C1) \\ 频数
Простое объединение существующих категориальных и числовых функций в эффективную комбинацию вышеперечисленного может значительно увеличить количество превосходных доступных функций.
Комбинируя этот метод с основными методами разработки признаков, такими как линейная комбинация (только для деревьев решений), можно получить более значимые признаки, такие как:
N1 - median(N1)_by(C1)
N1 - mean(N1)_by(C1)
- Создание новых признаков с помощью генетического программирования
Символическая регрессия, основанная на генетическом программировании [первая рекомендуемая библиотека генетического программирования в среде Python — этоgplearn].
Два основных применения генетического программирования:
трансформация: Объедините и преобразуйте существующие функции.Метод комбинирования (унарные, бинарные и многомерные операторы) может быть определен пользователем, или вы можете использовать функции, поставляемые с библиотекой (такие как сложение, вычитание, умножение и деление, мин. , max, тригонометрические функции), экспоненциальная, логарифмическая). Целью комбинации является создание новых функций, наиболее «релевантных» для целевого значения y.
Спирмен в основном используется для деревьев решений (иммунное монотонное преобразование с одним признаком), а Пирсон в основном используется для других алгоритмов, таких как линейная регрессия.
регрессия): Принцип тот же, что и выше, но он используется непосредственно для регрессии.
- Создавайте новые функции с деревьями решений:
В семействе алгоритмов дерева решений (одиночное дерево решений, gbdt, случайный лес) каждая выборка сопоставляется с листом дерева решений. Следовательно, мы можем добавить индекс (натуральное число) или один горячий вектор (разреженный вектор, полученный фиктивным кодированием) после того, как выборка отображается каждым деревом решений в качестве нового признака, и добавить его в модель.
Конкретная реализация: методы apply() и solution_path() доступны как в scikit-learn, так и в xgboost.
5) Модель
- модель дерева:
Нечувствительные к величине значения признака обработка безразмерного и статистического преобразования не могут быть выполнены; поскольку цифровая модель опирается на выборочное расстояние для обучения, нет необходимости выполнять кодирование признака категории (но признаки символьного типа нельзя использовать напрямую в качестве входных данных, поэтому необходимо как минимум выполнить кодирование метки). И LightGBM, и XGBoost могут изучать NaN как часть данных, поэтому нет необходимости иметь дело с пропущенными значениями. В других случаях нам нужно использовать .
- Модели, которые полагаются на выборочное расстояние для обучения (например, линейная регрессия, SVM, глубокое обучение и т. д.):
Для числовых признаков требуется безразмерная обработка, для некоторых признаков данных с длинными хвостами может быть выполнено статистическое преобразование, чтобы сделать модель лучше, для линейных моделей объединение признаков может улучшить выразительную способность модели;
Примечание: объедините содержание работы и изучите и обобщите вышеуказанное содержание.Если есть какая-либо ошибка, пожалуйста, укажите на нее и искренне попросите совета.
использованная литература
Гуан Юй: [Непрерывное обновление] Практические навыки разработки функций машинного обучения zhuanlan.zhihu.com
Серия Feature Engineering: очистка данных
Автор: Ван Юэ, эксперт по алгоритмам машинного обучения TAL.