Машинное обучение — быстрый старт в разработке функций

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

содержание

  • набор данных
    • Доступные наборы данных

    • набор данных sklearn

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

    • текст

  • Предварительная обработка функций
    • Безразмерность
      • Нормализованный
      • стандартизация
  • Характеристика
    • Выбор функции

    • Анализ основных компонентов (уменьшение размеров PCA)

набор данных

Вот несколько примеров того, что считается набором данных:

  • Таблица или файл CSV с некоторыми данными

  • Организованная коллекция столов

  • Файл в собственном формате, содержащий данные

  • Набор файлов, которые вместе образуют значимый набор данных

  • Структурированные объекты, содержащие данные в других форматах, которые вы можете захотеть загрузить в специальные инструменты для обработки

  • изображение захваченных данных

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

  • все, что похоже на набор данных

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

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

Цель

  • Использование 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

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

Предварительная обработка функций

Цель

  • Понимать характеристики числовых данных и категорийных данных

  • Используйте MinMaxScaler для нормализации данных объектов.

  • Стандартизация данных объектов с использованием StandardScaler

Что такое предварительная обработка признаков

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

在这里插入图片描述Это можно понять из приведенной выше картинки

Включено

Безразмерность числовых данных:

  • Нормализованный

  • стандартизация

API предварительной обработки функций

sklearn.preprocessing

Почему мы хотим нормализовать/нормализовать?

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

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

Нормализованный

определение

Сопоставьте данные с (по умолчанию [0,1]), преобразовав исходные данные

формула

Воздействуя на каждый столбец, max — это максимальное значение столбца, min — минимальное значение столбца, затем X'' — конечный результат, mx, mi — указанные значения интервала соответственно. По умолчанию mx равно 1 и mi равно 0.

API

  • sklearn.preprocessing.MinMaxScaler (feature_range = (0,1)…)
    • MinMaxScalar.fit_transform(X)

      • X: данные в формате массива numpy [n_samples, n_features]
    • Возвращаемое значение: преобразованный массив той же формы

расчет данных

Мы оперируем следующими данными в файле date.txt. Сохраняются данные объекта предыдущей даты.

milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1

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

  • Создание экземпляра MinMaxScalar

  • Преобразование через fit_transform

def minmax_demo():
    """
    归一化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3]
    print(data)

    # 2、实例化一个转换器类
    transform = MinMaxScaler()
    # transform = MinMaxScaler(feature_range=[2, 3])

    # 3、调用fit_transform
    data_new = transform.fit_transform(data)
    print("data_new:\n", data_new)
    return None

Нормализованное резюме

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

стандартизация

определение

Преобразуйте данные, чтобы иметь среднее значение 0 и стандартное отклонение 1 путем преобразования исходных данных.

формула

Действуя на каждый столбец, среднее значение — это среднее значение, σ — стандартное отклонение.

Итак, вернемся к точке исключения, давайте еще раз посмотрим на стандартизацию.

  • Для нормализации: если есть выбросы, которые влияют на максимальное и минимальное значения, результаты, очевидно, изменятся.

  • Для стандартизации: если есть аномальные точки, из-за определенного количества данных небольшое количество аномальных точек

  • Влияние на среднее значение невелико, поэтому дисперсия меняется меньше.

API

  • sklearn.preprocessing.StandardScaler( )
    • После обработки для каждого столбца все данные группируются вокруг среднего значения 0, а стандартное отклонение равно 1.
    • StandardScaler.fit_transform(X)
      • X: данные в формате массива numpy [n_samples, n_features]
    • Возвращаемое значение: преобразованный массив той же формы

расчет данных

Сделайте то же самое с приведенными выше данными.

[[90,2,10,40],
[60,4,15,45],
[75,3,13,46]]

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

  • Создание экземпляра StandardScaler

  • Преобразование через fit_transform

def stand_demo():
    """
    进行标准化
    在已有样本足够多的情况下,适合现在嘈杂大数据场景
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3]
    print(data)

    # 2、实例化一个转换器类
    transform = StandardScaler()

    # 3、调用fit_transform
    data_new = transform.fit_transform(data)
    print("data_new:\n", data_new)
    return None

Стандартизированное резюме

Он относительно стабилен при наличии достаточного количества выборок и подходит для современных сценариев больших данных с большим количеством помех.

Уменьшение размерности признаков

Цель

  • Знать три способа встраивания, фильтрации и переноса выбора функций.

  • Примените VarianceThreshold, чтобы удалить функции с низкой дисперсией

  • Понимать характеристики и расчет коэффициента корреляции

  • Выбор признаков с использованием коэффициентов корреляции

Снижение размерности

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

  • уменьшить количество случайных величин

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

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

Два способа уменьшения размерности

  • Выбор функции

  • Анализ основных компонентов (может понять способ извлечения признаков)

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

Что такое выбор функций

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

метод:

  • Фильтр (тип фильтра): в основном исследует характеристики самой функции, взаимосвязь между функцией и функцией и целевое значение.

    • Метод выбора дисперсии: фильтрация признаков с низкой дисперсией
    • Коэффициент корреляции
  • Встроенный: алгоритм автоматически выбирает функции (связи между функциями и целевыми значениями).

    • Дерево решений: информационная энтропия, прирост информации
    • Регуляризация: L1, L2
    • Глубокое обучение: свертки и многое другое
  • Обертка

модуль

sklearn.feature_selection

фильтр

Фильтрация объектов с низкой дисперсией

Удалите некоторые признаки низкой дисперсии, значение дисперсии упоминалось ранее. В сочетании с размером дисперсии рассматривается угол этого метода.

  • Небольшая дисперсия признаков: большинство образцов признака имеют схожие значения.

  • Большая дисперсия признака: значения многих образцов признака различны

API

  • sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
    • Удалить все функции с низкой дисперсией
    • Variance.fit_transform(X)
      • X: данные в формате массива numpy [n_samples, n_features]
      • Возвращаемое значение: функции с дисперсией тренировочного набора ниже порогового значения будут удалены. По умолчанию сохраняются все функции с ненулевой дисперсией, т. е. удаляются функции с одинаковым значением во всех выборках.

расчет данных

Выполняем фильтр между индикаторными характеристиками тех или иных акций

Все эти функции

pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense
index,pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense,date,return
0,000001.XSHE,5.9572,1.1818,85252550922.0,0.8008,14.9403,1211444855670.0,2.01,20701401000.0,10882540000.0,2012-01-31,0.027657228229937388
1,000002.XSHE,7.0289,1.588,84113358168.0,1.6463,7.8656,300252061695.0,0.326,29308369223.2,23783476901.2,2012-01-31,0.08235182370820669
2,000008.XSHE,-262.7461,7.0003,517045520.0,-0.5678,-0.5943,770517752.56,-0.006,11679829.03,12030080.04,2012-01-31,0.09978900335112327
3,000060.XSHE,16.476,3.7146,19680455995.0,5.6036,14.617,28009159184.6,0.35,9189386877.65,7935542726.05,2012-01-31,0.12159482758620697
4,000069.XSHE,12.5878,2.5616,41727214853.0,2.8729,10.9097,81247380359.0,0.271,8951453490.28,7091397989.13,2012-01-31,-0.0026808154146886697
def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1: -2]
    print(data)

    # 2、实例化一个转换器
    transfer = VarianceThreshold(threshold=5)

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new", data_new, data_new.shape)
    return None


if __name__ == '__main__':
    # 低方差特征过滤
    variance_demo()

Коэффициент корреляции

Коэффициент корреляции Пирсона: Статистический показатель, отражающий тесноту корреляции между переменными.

Дело расчета формулы (понять, запоминать не надо)

формула:

Например, мы рассчитываем годовые инвестиции в рекламу и среднемесячный объем продаж.

= 0.9942

Итак, мы наконец пришли к выводу, что существует высокая положительная корреляция между расходами на рекламу и среднемесячными продажами.​

Функции

Значение коэффициента корреляции находится в пределах от –1 до +1, т.е. –1≤r≤+1. Его свойства следующие:

  • Когда r>0, это означает, что две переменные имеют положительную корреляцию, а когда r

  • Когда |r|=1, это означает, что две переменные полностью коррелированы; когда r=0, это означает, что между двумя переменными нет корреляции.

  • Когда 0<|r| |r|>

В целом его можно разделить на три уровня: |r|

Это обозначение: |r| — абсолютное значение r, |-5|=5

API

from scipy.stats import pearsonr
x : (N,) array_like
y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)

Анализ главных компонентов

Цель

  • Уменьшение размерности признаков с помощью PCA

  • Применение: анализ основных компонентов между пользователями и категориями элементов

Что такое анализ главных компонентов (PCA)

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

эффект: это сжатие размерности данных, которое максимально уменьшает размерность (сложность) исходных данных и теряет небольшое количество информации.

применение: В регрессионном анализе или кластерном анализе

Так как насчет лучшего понимания этого процесса? Давайте посмотрим на картинку

API

  • sklearn.decomposition.PCA(n_components=None)
    • Разложить данные на пространства меньшего размера
    • n_components:
      • Десятичный: указывает, сколько информации нужно сохранить.
      • Целое число: сколько признаков нужно свести к
    • PCA.fit_transform(X) X: данные в формате массива numpy [n_samples, n_features]
    • Возвращаемое значение: массив указанного измерения после преобразования

расчет данных

[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]
def pca():
    """
    主成分分析进行降维
    :return:
    """
    # 信息保留70%
    pca = PCA(n_components=0.7)
    data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])
    print(data)

    return None

Кейс: Изучение пользовательских предпочтений для сегментации категорий элементов и уменьшения размерности

данные

  • order_products__prior.csv: информация о заказе и продукте

    • Поля: order_id, product_id, add_to_cart_order, переупорядочен
  • products.csv: информация о продукте

    • Поля: product_id, product_name, aisle_id, Department_id
  • orders.csv: информация о заказе пользователя

    • Поля: order_id, user_id, eval_set, order_number, ….
  • aisles.csv: конкретная категория предметов, к которой принадлежит предмет.

    • Поля: aisle_id, проход

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

  • Объедините таблицы, чтобы user_id и проход были в одной таблице

  • выполнить кросс-табличное преобразование

  • уменьшение размерности

def pca_case_study():
    """
    主成分分析案例
    :return: 
    """
    # 去读四张表的数据
    prior = pd.read_csv("./instacart/order_products__prior.csv")
    products = pd.read_csv("./instacart/products.csv")
    orders = pd.read_csv("./instacart/orders.csv")
    aisles = pd.read_csv("./instacart/aisles.csv")

    print(prior)

    # 合并四张表
    mt = pd.merge(prior, products, on=['product_id', 'product_id'])
    mt1 = pd.merge(mt, orders, on=['order_id', 'order_id'])
    mt2 = pd.merge(mt1, aisles, on=['aisle_id', 'aisle_id'])
    
    # pd.crosstab 统计用户与物品之间的次数关系(统计次数)
    cross = pd.crosstab(mt2['user_id'], mt2['aisle'])

    # PCA进行主成分分析
    pc = PCA(n_components=0.95)
    data_new = pc.fit_transform(cross)
    print("data_new:\n", data_new.shape)

    return None