Анализ нескольких методов дискретизации признаковых данных

машинное обучение искусственный интеллект
Анализ нескольких методов дискретизации признаковых данных

Это 16-й день моего участия в ноябрьском испытании обновлений.Подробности о событии:Вызов последнего обновления 2021 г.

Что такое дискретизация?

Дискретизация заключается в отображении конечных индивидуумов в бесконечном пространстве в конечное пространство, чтобы улучшить пространственно-временную эффективность алгоритма. С точки зрения непрофессионала, дискретизация заключается в соответствующем уменьшении данных без изменения относительного размера данных. Например:

  • Исходные данные: 1,999,100000,15 после обработки: 1,3,4,2;

  • Исходные данные: {100,200}, {20,50000}, {1,400} После обработки: {3,4}, {2,6}, {1,5};

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

Дискретизация признаков (биннинг) может быть разделена с разных точек зрения. Когда метод группирования использует информацию о цели y, тогда метод группирования относится к методу контролируемого группирования, и наоборот, является методом неконтролируемого группирования.

В этой статье будут представлены несколько распространенных методов дискретизации признаков:

  1. Биннинг по расстоянию — без присмотра
  2. Равночастотное бинирование — без присмотра
  3. Биннинг с кластеризацией — без присмотра
  4. Информационная энтропия Биннинг — под наблюдением
  5. Биннинг на основе дерева решений — под наблюдением
  6. Биннинг хи-квадрат - под наблюдением

Смысл дискретизации данных

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

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

1. Потребности алгоритма

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

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

Например, доход от заработной платы, месячная заработная плата 2000 и месячная заработная плата 20 000, с точки зрения непрерывных характеристик, разницу между высокой и низкой заработной платой можно понять только на числовом уровне, но если ее преобразовать в дискретные данные (базовая заработная плата , высокая заработная плата), можно выразиться более интуитивно: мы получили ту высокую заработную плату и базовую заработную плату, которые имели в виду.

3. Он может эффективно устранять скрытые дефекты в данных, делать результаты модели более стабильными и повышать надежность модели.

4. Улучшить способность модели к обобщению

5. Расширьте область применения данных в различных типах алгоритмов.

6. Увеличьте способность к нелинейному выражению

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

Конечно, дискретизация признаков также имеет свои недостатки, а именно:

1. Операция биннинга неизбежно приведет к определенной степени потери информации.

2. Добавлен процесс: в процесс моделирования добавлен дополнительный шаг дискретизации

3. Влияние на стабильность модели

Когда собственное значение находится на краю точки биннинга, небольшое отклонение приведет к тому, что атрибуция собственного значения перескочит с одного поля на другое, что повлияет на стабильность модели.

Подготовить данные

Загрузите набор данных о раке молочной железы и распечатайте исходное распределение признаков.

import seaborn as sns
import pandas as pd
from sklearn.datasets import load_breast_cancer

# 加载乳腺癌数据集
bc = load_breast_cancer()
df = pd.DataFrame.from_records(data=bc.data, columns=bc.feature_names)
df['target'] = bc.target

sns.distplot(df['mean radius'], kde=False)

Результаты приведены ниже:

image.png

# 查看数据的统计摘要,如均值,最大值,最小值等
df.describe()[['mean radius','target']]

Результаты приведены ниже:

mean radius target
count 569.000000 569.000000
mean 14.127292 0.627417
std 3.524049 0.483918
min 6.981000 0.000000
25% 11.700000 0.000000
50% 13.370000 1.000000
75% 15.780000 1.000000
max 28.110000 1.000000

Биннинг по расстоянию (метод интервала расстояний)

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

Изометрический биннинг

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

w=maxminnw = \frac {max- min}{n}

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

Следующее использует функцию cut в pandas для реализации биннинга одинаковой ширины, Код выглядит следующим образом:

import pprint
# 等宽分箱(Equal-Width Binning)
value, cutoff = pd.cut(df['mean radius'], bins=4, retbins=True, precision=2)
radius = df['mean radius']
print(radius.head())
print("-------------------")
print(value.head())
print("-------------------")
pprint.pprint(cutoff)

Результаты приведены ниже:

0    17.99
1    20.57
2    19.69
3    11.42
4    20.29
Name: mean radius, dtype: float64
-------------------
0    (17.55, 22.83]
1    (17.55, 22.83]
2    (17.55, 22.83]
3     (6.96, 12.26]
4    (17.55, 22.83]
Name: mean radius, dtype: category
Categories (4, interval[float64]): [(6.96, 12.26] < (12.26, 17.55] < (17.55, 22.83] < (22.83, 28.11]]
-------------------
array([ 6.959871, 12.26325 , 17.5455  , 22.82775 , 28.11    ])

Визуализируйте:

df1 = value.to_frame()
df1.columns = ['bins']
sns.countplot(df1['bins'])

image.png

Расчет равноудаленного биннинга прост, но когда числовая дисперсия велика, то есть велика степень разброса данных, очень вероятно, что будет биннинг без каких-либо данных.Эта проблема может быть решена с помощью метода биннинга адаптивное распределение данных (равночастотный биннинг). ), которого следует избегать.

Пользовательский биндинг по расстоянию

Следующие два метода используются для реализации пользовательского бинирования по расстоянию с использованием функции оцифровки numpy и функции вырезания pandas.

import numpy as np
import pandas as pd

small_counts = np.random.randint(0, 10000, 20)

df = pd.DataFrame()
df['amount'] = small_counts

# 注意:bins数据是有要求的,bins内的数据一定要是降序或者升序的数据,不能是一堆无序数据。
bins=[0,200,1000,5000,10000]

# 方法一
df['amount_cut']=pd.cut(df['amount'], bins)

# 方法二
indices=np.digitize(df['amount'],bins) # 返回值为每个值所属区间的索引。
print(indices)
df['amount_split']=[str(bins[i-1])+"~"+str(bins[i]) for i in indices] 
print(df.head())

Результаты приведены ниже:

[2 4 4 2 3 3 4 3 1 4 3 4 4 4 4 3 3 4 3 4]
   amount     amount_cut amount_split
0     296    (200, 1000]     200~1000
1    9938  (5000, 10000]   5000~10000
2    5442  (5000, 10000]   5000~10000
3     240    (200, 1000]     200~1000
4    3811   (1000, 5000]    1000~5000

Визуализируйте:

sns.countplot(df['amount_cut'])

image.png

sns.countplot(df['amount_split'])

image.png

Экспоненциальное интервальное бинирование

Когда значения охватывают несколько порядков, лучше всего группировать по степеням 10 (или степеням любой константы): от 0 до 9, от 10 до 99, от 100 до 999, от 1000 до 9999.

import pprint

large_counts = np.array([296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971,926, 122, 22222])

print(large_counts.tolist())
 
bins=np.floor(np.log10(large_counts))   # 取对数之后再向下取整

print(bins)

pprint.pprint(np.array(['['+str(10**i)+','+str(10**(i+1))+')' for i in bins]))

Результаты приведены ниже:

[296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
[2. 3. 4. 1. 0. 2. 2. 3. 3. 4. 4. 1. 1. 3. 2. 2. 4.]
array(['[100.0,1000.0)', '[1000.0,10000.0)', '[10000.0,100000.0)',
       '[10.0,100.0)', '[1.0,10.0)', '[100.0,1000.0)', '[100.0,1000.0)',
       '[1000.0,10000.0)', '[1000.0,10000.0)', '[10000.0,100000.0)',
       '[10000.0,100000.0)', '[10.0,100.0)', '[10.0,100.0)',
       '[1000.0,10000.0)', '[100.0,1000.0)', '[100.0,1000.0)',
       '[10000.0,100000.0)'], dtype='<U18')

Равночастотный биннинг (квантильный метод)

Как следует из названия, равночастотное бинирование теоретически одинаково в каждом бине после разделения.Однако, когда определенное значение встречается чаще, будет казаться, что граница равного разделения является одним и тем же значением, что приводит к тому, что одно и то же значение делится в разные корзины. Это неправильно.

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

Конкретный код выглядит следующим образом:

s1 = pd.Series([1,2,3,4,5,6])
value, cutoff = pd.qcut(s1, 3, retbins=True)
print(value)
print("------------------")
print(cutoff)

результат операции:

0    (0.999, 2.667]
1    (0.999, 2.667]
2    (2.667, 4.333]
3    (2.667, 4.333]
4      (4.333, 6.0]
5      (4.333, 6.0]
dtype: category
Categories (3, interval[float64]): [(0.999, 2.667] < (2.667, 4.333] < (4.333, 6.0]]
------------------
[1.         2.66666667 4.33333333 6.        ]

Визуализируйте:

sns.countplot(value)

image.png

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

s1 = pd.Series([1,2,3,4,5,6,6,6,6])
value, cutoff = pd.qcut(s1, 3, duplicates='drop', retbins=True)

результат операции:

0    (0.999, 3.667]
1    (0.999, 3.667]
2    (0.999, 3.667]
3      (3.667, 6.0]
4      (3.667, 6.0]
5      (3.667, 6.0]
6      (3.667, 6.0]
7      (3.667, 6.0]
8      (3.667, 6.0]
dtype: category
Categories (2, interval[float64]): [(0.999, 3.667] < (3.667, 6.0]]
------------------
[1.         3.66666667 6.        ]

Визуализируйте:

sns.countplot(value)

image.png

Первоначально его планировалось разделить на 3 поля, но поскольку одно и то же значение было разделено на разные поля, оно было объединено, поэтому в итоге осталось только 2 поля.

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

value, cutoff = pd.qcut(df['mean radius'], 4, duplicates='drop', retbins=True)
print(value)
print("------------------")
print(cutoff)

Результат выглядит следующим образом:

0                  (15.78, 28.11]
1                  (15.78, 28.11]
2                  (15.78, 28.11]
3      (6.9799999999999995, 11.7]
4                  (15.78, 28.11]
                  ...            
564                (15.78, 28.11]
565                (15.78, 28.11]
566                (15.78, 28.11]
567                (15.78, 28.11]
568    (6.9799999999999995, 11.7]
Name: mean radius, Length: 569, dtype: category
Categories (4, interval[float64]): [(6.9799999999999995, 11.7] < (11.7, 13.37] < (13.37, 15.78] < (15.78, 28.11]]
------------------
[ 6.981 11.7   13.37  15.78  28.11 ]

Визуализируйте:

sns.countplot(value)

image.png

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

Дискретизация с кластеризацией

Кластерный анализ — популярный метод дискретизации. Непрерывные значения атрибутов кластеризуются алгоритмом кластеризации (алгоритм K-средних), и k кластеров, полученных после кластеризации, обрабатываются. Кластеризация учитывает распределение значений атрибутов данных, а также близость точек данных, что позволяет получать высококачественные результаты дискретизации.

import numpy as np
import pandas as pd
from sklearn.cluster import KMeans

small_counts = np.random.randint(0, 10000, 20)
df = pd.DataFrame()
df['amount'] = small_counts

data_reshape = small_counts.reshape((data.shape[0],1))
model_kmeans = KMeans(n_clusters=4,random_state=0)
kmeans_result = model_kmeans.fit_predict(data_reshape)
df['amount_cut'] = kmeans_result
df.sort_values(by=['amount_cut'])

результат операции:

amount amount_cut
9 9449 0
16 8283 0
15 7755 0
14 8226 0
13 9257 0
12 7068 0
7 7658 0
19 8728 0
4 2017 1
3 2956 1
2 3310 1
10 4500 2
11 4029 2
5 4936 2
17 5337 2
6 3971 2
8 432 3
18 208 3
1 1023 3
0 327 3

Биннинг информационной энтропии

Методы бинирования по расстоянию и бинирования по равной частоте, описанные выше, обеспечивают ограниченную оптимизацию для моделирования. Если выборки в бине хорошо различимы по y, то это хороший биннинг. Благодаря теории информации мы знаем, что информационная энтропия измеряет эту способность к различению. Когда функция делится на верхнюю и нижнюю части в соответствии с определенной точкой разделения, можно добиться максимального прироста информации, тогда это хорошая точка разделения. Из вышеизложенного видно, что биннинг информационной энтропииконтролируемыйметод биннинга. На самом деле принцип разбиения узлов дерева решений также основан на информационной энтропии.

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

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

Примечание об энтропии, информации и информационной энтропии:

Понятие энтропии возникло в физике и используется для измерения степени беспорядка в термодинамической системе. В теории информации энтропия является мерой неопределенности.

Информация — это то, что используется для устранения случайной неопределенности.

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

Биннинг на основе дерева решений

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

Принцип бинирования дерева решений заключается в использовании переменной (одномерной), которая должна быть дискретизирована, чтобы соответствовать целевой переменной с моделью дерева.Например, напрямую используйте дерево решений, предоставленное sklearn (реализованное с деревом решений корзины), а затем разделите внутренние узлы Порог как точка отсечки для биннинга.

Здесь мы берем данные по раку молочной железы в качестве примера, сначала возьмемmean radiusполя иtargetполя, соответствующие дереву решений.

import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
import numpy as np

# bc = load_breast_cancer()
# df = pd.DataFrame.from_records(data=bc.data, columns=bc.feature_names)
# df['target'] = bc.target
print(df.sample(5)[["mean radius","target"]])

print("-----------------")

dt = DecisionTreeClassifier(criterion='entropy', max_depth=3) # 树最大深度为3
dt.fit(df['mean radius'].values.reshape(-1, 1), df['target'])

print(dt.tree_.feature) # 存放每个节点所采用的特征
print(dt.tree_.threshold) # 存放每个节点特征的阈值
print(dt.tree_.children_left) # 存放经过特征和阈值分裂之后的左孩子
print(dt.tree_.children_right) # 存放经过特征和阈值分裂之后右孩子

print("-----------------")
# 取出这课决策树的所有叶节点的分割点的阈值
print(np.where(dt.tree_.children_right > -1))
qtsr = dt.tree_.threshold[np.where(dt.tree_.children_right > -1)]
print(qtsr)

print(np.where(dt.tree_.children_left > -1))
qts = dt.tree_.threshold[np.where(dt.tree_.children_left > -1)]
print(qts)

print("-----------------")

qts = np.sort(qts)
res = [np.round(x, 3) for x in qts.tolist()]

print(res)

результат операции:

     mean radius  target
556        10.16       1
254        19.45       0
117        14.87       0
65         14.78       0
568         7.76       1
-----------------
[ 0  0  0 -2 -2  0 -2 -2  0  0 -2 -2 -2]
[15.04500008 13.09499979 10.94499969 -2.         -2.         13.70499992
 -2.         -2.         17.88000011 17.80000019 -2.         -2.
 -2.        ]
[ 1  2  3 -1 -1  6 -1 -1  9 10 -1 -1 -1]
[ 8  5  4 -1 -1  7 -1 -1 12 11 -1 -1 -1]
-----------------
(array([0, 1, 2, 5, 8, 9]),)
[15.04500008 13.09499979 10.94499969 13.70499992 17.88000011 17.80000019]
(array([0, 1, 2, 5, 8, 9]),)
[15.04500008 13.09499979 10.94499969 13.70499992 17.88000011 17.80000019]
-----------------
[10.945, 13.095, 13.705, 15.045, 17.8, 17.88]

Примечание. Здесь дается только 6 баллов, но это эквивалентно 7 клеткам.

Визуализируйте:

Мы устанавливаем эти 7 полей как a-g соответственно, и мы можем нарисовать эффект разделения:

radius = df['mean radius'].values.tolist()

r = []
for i in radius:
    if i < res[0]:
        r.append('a')
    elif i >= res[-1]:
        r.append('g')
    else:
        for j in range(0, 5):
            if i > res[j] and i <= res[j+1]:
                r.append(chr(98+j))
                break
sns.countplot(r)

image.png

Биннинг хи-квадрат (ChiMerge)

Биннинг хи-квадрат — это восходящий (т. е. основанный на объединении) метод дискретизации данных. Он основан на тесте хи-квадрат: соседние интервалы с наименьшим значением хи-квадрат объединяются вместе до тех пор, пока не будет выполнен определенный критерий остановки.

О тесте хи-квадрат:

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

В основном состоит из двух этапов:Фаза инициализации и фаза восходящего слияния.

1. Этап инициализации:

Сначала отсортируйте по размеру значения атрибута (для несплошных объектов нужно сначала сделать числовое преобразование, а затем отсортировать), а затем каждое значение атрибута как отдельную группу.

2. Этап слияния:

(1) Для каждой пары смежных групп рассчитайте значение хи-квадрат.

(2) В соответствии с вычисленным значением хи-квадрат объедините наименьшую пару соседних групп в одну группу.

(3) Повторять (1) и (2) до тех пор, пока вычисленное значение хи-квадрат не будет ниже заданного порога или количество групп не достигнет определенного условия (например, минимальное количество групп равно 5, а максимальное количество групп 8).

Проще говоря, группировка хи-квадрат заключается в непрерывном вычислении значения хи-квадрат соседних интервалов (чем меньше значение хи-квадрат, тем более похоже распределение) и интервалов с аналогичным распределением (наименьшее значение хи-квадрат). объединяются до смежных интервалов. Распределения различны для достижения идеального результата биннинга. Идеальный биннинг состоит в том, что распределение меток в пределах одного интервала одинаково.

Справочная документация