Это 20-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Что такое извлечение признаков?
Извлечение признаков заключается в уменьшении размерности некоторых исходных входных данных или рекомбинации исходных признаков для последующего использования.
Например: Мы знаем, что иногда исходные данные имеют множество признаков, причем некоторые из них сильно коррелированы, а некоторые не связаны с конечной целью. Нам нужно удалить функции, которые не связаны между собой. (уменьшить измерение данных) Для изображений каждое изображение содержит много данных. В настоящее время вычисление необработанных данных напрямую будет очень медленным, что не очень хорошо для нас, чтобы работать в режиме реального времени. Нам нужно извлечь новые функции. (уменьшить измерение данных) Мы получаем новую функцию с помощью многомерных функций исходных данных и, наконец, используем эту новую функцию для принятия решений. (Организация существующих функций данных)
Что делает извлечение признаков?
- Уменьшить размеры данных
- Извлечение или сортировка допустимых функций для последующего использования
Методы извлечения признаков в sklearn
sklearn в настоящее время включает методы для извлечения функций из текста и изображений.
метод | инструкция |
---|---|
feature_extraction.DictVectorizer(*[, …]) |
Извлечение признаков из словаря |
feature_extraction.FeatureHasher([…]) |
Хэш функции |
Извлечение текстовых признаков
метод | инструкция |
---|---|
feature_extraction.text.CountVectorizer(*[, …]) |
Преобразование набора текстовых документов в матрицу частоты терминов |
feature_extraction.text.HashingVectorizer(*) |
Векторизация набора текстовых документов с помощью трюков хеширования |
feature_extraction.text.TfidfTransformer(*) |
Преобразуйте разреженную матрицу, сгенерированную CountVectorizer, в матрицу признаков TF-IDF. |
feature_extraction.text.TfidfVectorizer(*[, …]) |
Преобразование исходной коллекции документов в матрицу признаков TF-IDF |
DictVectorizer - загружать функции из словаря
Класс DictVectorizer можно использовать для преобразования данных в стандартный Python.dict
Список объектов представляет собой массив функций представления, преобразованный в форму NumPy/SciPy, используемую оценщиками scikit-learn.
Хотя не особенно быстро, Pythondict
Имеет следующие преимущества: простота использования, разреженность (отсутствующие функции не нужно сохранять), а имена функций сохраняются в дополнение к значениям функций.
DictVectorizer используется для категориальных функций путем реализации «горячего» кодирования. Категориальные функции имеют форму пар атрибут-значение, где значения ограничены неупорядоченным списком соответствующих требований (например, идентификаторы субъектов, типы объектов, теги, имена и т. д.).
В следующем примере «город» является категориальным атрибутом, а «температура» — традиционным числовым признаком:
>>> measurements = [
... {'city': 'Dubai', 'temperature': 33.},
... {'city': 'London', 'temperature': 12.},
... {'city': 'San Francisco', 'temperature': 18.},
... ]
>>> from sklearn.feature_extraction import DictVectorizer
>>> vec = DictVectorizer()
>>> vec.fit_transform(measurements).toarray()
array([[ 1., 0., 0., 33.],
[ 0., 1., 0., 12.],
[ 0., 0., 1., 18.]])
>>> vec.get_feature_names()
['city=Dubai', 'city=London', 'city=San Francisco', 'temperature']
FeatureHasher - хэш функции
FeatureHasher — это высокоскоростной векторизованный класс с малым объемом памяти. Он использует метод, называемый хешированием признаков (или «хеш-трюком»).
Этот класс является заменой DictVectorizer и CountVectorizer с низким объемом памяти для крупномасштабного (онлайн) обучения и ситуаций с нехваткой памяти.
Выход FeatureHasher всегда представляет собой матрицу scipy.sparse в формате CSR.
>>> from sklearn.feature_extraction import FeatureHasher
>>> hasher = FeatureHasher(n_features=10)
>>> D = [{'dog': 1, 'cat':2, 'elephant':4},{'dog': 2, 'run': 5}]
>>> f = hasher.transform(D)
>>> f.toarray()
array([[ 0., 0., -4., -1., 0., 0., 0., 0., 0., 2.],
[ 0., 0., 0., -2., -5., 0., 0., 0., 0., 0.]])
Параметры: n_features — количество признаков (столбцов) в выходной матрице. При линейном обучении небольшое количество признаков может легко привести к коллизиям хэшей, в то время как большое количество признаков приводит к большой размерности коэффициентов.
Извлечение текстовых признаков
CountVectorizer — матрица частот терминов
CountVectorizer — это метод извлечения текстовых признаков. Для каждого обучающего текста учитывается только частота каждого слова в этом обучающем тексте.
Класс CountVectorizer имеет множество параметров, которые разделены на три этапа обработки: предварительная обработка, токенизация и генерация n-грамм.
>>> from sklearn.feature_extraction.text import CountVectorizer
>>> texts=["dog cat fish","dog cat cat","fish bird", 'bird']
>>> cv = CountVectorizer() # 创建词袋数据结构
>>> cv_fit=cv.fit_transform(texts)
>>> print(cv.get_feature_names()) # 列表形式呈现文章生成的词典
['bird', 'cat', 'dog', 'fish']
>>> print(cv.vocabulary_) # 字典形式呈现,key:词,value:词频
{'dog': 2, 'cat': 1, 'fish': 3, 'bird': 0}
>>> print(cv_fit.toarray()) # 词频矩阵
array([[0, 1, 1, 1],
[0, 2, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 0]])
CountVectorizer преобразует слова в тексте в матрицу частот слов с помощью функции fit_transform, Элемент матрицы a[i][j] представляет частоту слов j-го слова под i-м текстом, то есть количество раз каждого появляется слово. Ключевые слова всех текстов можно увидеть с помощью get_feature_names(), а результат матрицы частоты слов можно увидеть с помощью toarray().
HashingVectorizer
HashingVectorizer использует приемы хеширования для векторизации текста.
Функции
Обычный CountVectorizer существует, но когда тезаурус большой, он занимает много памяти, поэтому HashingVectorizer использует навыки хеширования и использует разреженную матрицу для хранения скомпилированной матрицы, что может очень хорошо решить эту проблему.
>>> from sklearn.feature_extraction.text import HashingVectorizer
>>> corpus = [
... 'This is the first document.',
... 'This document is the second document.',
... 'And this is the third one.',
... 'Is this the first document?',
... ]
>>> vectorizer = HashingVectorizer(n_features=2**4)
>>> X = vectorizer.fit_transform(corpus)
>>> X
<4x16 sparse matrix of type '<class 'numpy.float64'>'
with 16 stored elements in Compressed Sparse Row format>
>>> X.toarray()
array([[-0.57735027, 0. , 0. , 0. , 0. ,
0. , 0. , 0. , -0.57735027, 0. ,
0. , 0. , 0. , 0.57735027, 0. ,
0. ],
[-0.81649658, 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0.40824829, 0. , 0.40824829, 0. ,
0. ],
[ 0. , 0. , 0. , 0. , -0.70710678,
0.70710678, 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. ],
[-0.57735027, 0. , 0. , 0. , 0. ,
0. , 0. , 0. , -0.57735027, 0. ,
0. , 0. , 0. , 0.57735027, 0. ,
0. ]])
TfidfTransformer
TfidfTransformer — это вес tf-idf каждого слова в матрице частоты слов, созданной CountVectorizer.
TF-IDF — это статистический метод оценки важности слова для набора документов или одного из документов в корпусе.Важность слова увеличивается пропорционально количеству раз, которое оно встречается в документе, но уменьшается обратно пропорционально частоте его появления в корпусе.
>>> from sklearn.feature_extraction.text import TfidfTransformer
>>> transformer = TfidfTransformer(smooth_idf=False)
>>> transformer
TfidfTransformer(smooth_idf=False)
>>>
>>> counts = [[3, 0, 1],
... [2, 0, 0],
... [3, 0, 0],
... [4, 0, 0],
... [3, 2, 0],
... [3, 0, 2]]
>>>
>>> tfidf = transformer.fit_transform(counts)
>>> tfidf
<6x3 sparse matrix of type '<class 'numpy.float64'>'
with 9 stored elements in Compressed Sparse Row format>
>>>
>>> tfidf.toarray()
array([[0.81940995, 0. , 0.57320793],
[1. , 0. , 0. ],
[1. , 0. , 0. ],
[1. , 0. , 0. ],
[0.47330339, 0.88089948, 0. ],
[0.58149261, 0. , 0.81355169]])
TfidfVectorizer
TfidfVectorizer принимает текстовые данные и выполняет извлечение признаков набора слов и преобразование TF-IDF.
TfidfVectorizer эквивалентен комбинации CountVectorizer и TfidfTransformer.
>>> corpus = [
... 'This is the first document.',
... 'This is the second second document.',
... 'And the third one.',
... 'Is this the first document?',
... ]
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> vectorizer = TfidfVectorizer()
>>> result = vectorizer.fit_transform(corpus)
>>> result.toarray()
array([[0. , 0.43877674, 0.54197657, 0.43877674, 0. ,
0. , 0.35872874, 0. , 0.43877674],
[0. , 0.27230147, 0. , 0.27230147, 0. ,
0.85322574, 0.22262429, 0. , 0.27230147],
[0.55280532, 0. , 0. , 0. , 0.55280532,
0. , 0.28847675, 0.55280532, 0. ],
[0. , 0.43877674, 0.54197657, 0.43877674, 0. ,
0. , 0.35872874, 0. , 0.43877674]])
Суммировать
sklearn поддерживает преобразование текста в матрицу частот слов (CountVectorizer), матрицу TF-IDF (TfidfVectorizer), хэш-матрицу (HashingVectorizer), эти три метода являются методами модели мешков слов, среди которых:TfidfVectorizer
Этот метод позволяет уменьшить интерференцию высокочастотных и малоинформативных слов и применяется чаще.