Машинное обучение — извлечение признаков

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

Извлечение признаков

Цель

  • Использование DictVectorizer для реализации числовых и дискретных характеристик категорий

  • Используйте CountVectorizer для количественной оценки текстовых функций

  • Используйте TfidfVectorizer для количественной оценки текстовых функций

  • Расскажите о разнице между двумя методами выделения текстовых признаков

определение

Извлечение признаков заключается в任意数据(например, текст или изображения)转换为可用于机器学习的数字特征

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

  • 字典特征提取(特征离散化)

  • 文本特征提取

  • 图像特征提取(深度学习)

API извлечения функций

sklearn.feature_extraction

Извлечение функций словаря

эффект:对字典数据进行特征值化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X) X: словарь или итератор, содержащий словарь, возвращаемое значение: возврат разреженной матрицы
    • DictVectorizer.inverse_transform(X) X: массив массив или разреженная матрица Возвращаемое значение: формат данных до преобразования
    • DictVectorizer.get_feature_names() возвращает имена категорий

применение

Выполните извлечение признаков для следующих данных

    data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]

Анализ процесса

  • Создать экземпляр класса DictVectorizer

  • Вызовите метод fit_transform для ввода данных и преобразования (обратите внимание на формат возврата).

def dict_demo():
    """
    字典特征值提取
    :return:
    """
    data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
    # 1. 实例化一个转换器   默认返回 sparse矩阵  将非0值按位置表示出来 以节省内存 提高加载效率
    transfer = DictVectorizer(sparse=False)

    # 应用场景:数据集中类别特征值较多;将数据集的特征-》字典类型;DictVectorizer转换;本身拿到的就是字典

    # 2. 调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names())
    return None

Обратите внимание на результат без добавленного параметра sparse=False.

Этот результат не то, что вы хотите видеть, поэтому добавьте параметры, чтобы получить желаемый результат, здесь мы называем эту технику обработки данных профессиональным названием"one-hot"кодирование.

Суммировать

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

Извлечение текстовых признаков

作用: Собственное значение текстовых данных

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

    • Матрица частоты возвращаемых слов
  • CountVectorizer.fit_transform(X) X: текст или итерируемый объект, содержащий текстовые строки Возвращаемое значение: возвращает разреженную матрицу

  • CountVectorizer.inverse_transform(X) X: массив массив или разреженная матрица Возвращаемое значение: формат данных до преобразования

  • CountVectorizer.get_feature_names() возвращаемое значение: список слов

  • sklearn.feature_extraction.text.TfidfVectorizer

применение

Выполните извлечение признаков для следующих данных

data = ["life is short, i like python", "life is too long i dislike python"]

Анализ процесса

  • Создать экземпляр класса CountVectorizer

  • Вызовите метод fit_transform для ввода данных и преобразования (обратите внимание на формат возврата, используйте toarray() для массива массива преобразования разреженных матриц)

def count_demo():
    """
    文本特征值抽取
    :return:
    """
    data = ["life is short, i like python", "life is too long i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 演示停用词
    # transfer = CountVectorizer(stop_words=["is", "too"])
    data_new = transfer.fit_transform(data)

    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    # 2、调用fit_transform

    return None

Вопрос: А если заменить данные на китайский?

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

В следующем коде необходимо заранее сделать пробелы в тексте.

def count_chinese_demo():
    """
    中文文本特征值抽取
    :return:
    """
    data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
    data2 = ["我爱北京天安门", "天安门上太阳升"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    data_new = transfer.fit_transform(data)

    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    # 2、调用fit_transform

    return None

Смотрите ниже для лучшего решения

Сегментация слова цзеба

  • jieba.cut()
    • Возвращает генератор слов

Необходимо установить библиотеку jieba

pip install jieba

анализ случая

    data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
            "TA绝大多数是想要尝试副业变现的朋友。",
            "从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]

анализировать

  • Подготовьте предложения и используйте jieba.cut для сегментации слов.

  • Создать экземпляр CountVectorizer

  • Превратите результат сегментации слов в строку в качестве входного значения fit_transform.

def count_word(text):
    """
    进行中文分词 我爱北京天安门-》我 爱 北京 天安门
    :param text:
    :return:
    """
    a = " ".join(list(jieba.cut(text)))
    print(a)
    return a


def count_chinese_demo2():
    """
    中文文本特征值抽取 自动分词
    :return:
    """
    data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
            "TA绝大多数是想要尝试副业变现的朋友。",
            "从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["从宝妈"])
    data_new = transfer.fit_transform(count_word(item) for item in data)

    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    # 2、调用fit_transform

    return None

Вопрос. Что делать, если слово или фраза часто встречается в нескольких статьях?

Извлечение текстовых признаков Tf-idf

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

Роль TF-IDF: используется для оценки важности слова для набора документов или документа в корпусе.

формула

Частота термина (tf) относится к частоте, с которой данное слово появляется в документе.

Частота обратного документа (idf) — это мера универсальной важности слова. IDF определенного слова можно разделить на общее количество документов, содержащих это слово. Количество файлов, а затем возьмем логарифм по основанию 10 от полученного частного, чтобы получить

Конечный результат можно понимать как степень важности.

Примечание. Если общее количество слов в документе равно 100, а слово «очень» встречается 5 раз, то частота слова «очень» в документе составляет 5/100 = 0,05. Частота документов (IDF) рассчитывается путем деления общего количества документов в наборе документов на количество документов, в которых встречается слово «очень». Итак, если слово «очень» встречается в 1000 документов, а общее количество документов равно 10 000 000, частота обратного документа равна lg(10 000 000 / 1 0000) = 3. Окончательная оценка «очень» для tf-idf этого документа составляет 0,05 * 3 = 0,15.

кейс

def tfidf_demo():
    """
    用TF-IDF方法进行文本特征值抽取
    :return:
    """
    data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
            "TA绝大多数是想要尝试副业变现的朋友。",
            "从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]
    transfer = TfidfVectorizer(stop_words=["从宝妈"])
    data_new = transfer.fit_transform(count_word(item) for item in data)

    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

Важность Tf-idf

Алгоритм классификационного машинного обучения для классификации статей на ранней стадии обработки данных