Фонд машинного обучения Sklearn (базовая обработка данных day01)

машинное обучение алгоритм

@[toc]

окрестности

python 3.7

sklearn

numpy

scipy

pip3 install numpy
pip3 install scipy
pip3 install sklearn

(Эта статья организована по примечаниям)

набор данных

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

sklearn.datasets

load_*  获取小规模数据集
fetch_* 获取大规模数据集
sklearn小数据集
sklearn.datasets.load_iris()
    
    
sklearn大数据集   sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

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

Тест означает, что данные проверяются, все означает, что оба теста, так и поезда обучены.

пример:

from sklearn.datasets import load_iris

Iris = load_iris()
print("查看数据描述:",Iris["DESCR"])
print("查看特征值名字:",Iris.feature_name)
print("查看特征值:",Iris.data)
print("查看数据集: ",Iris)

Этот набор данных представляет собой набор данных о том, как выглядит ирис (цветок).

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

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

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

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

Просто приведите пример, чтобы понять:

data = [{"city":"北京","template":25},
        {"city":"上海","template":55},
        {"city":"南昌","template":45}
       ]

Просмотрите обработанное значение напрямую:

特征名字: ['city=上海', 'city=北京', 'city=南昌', 'template']
特征值: [[ 0.  1.  0. 25.]
 		[ 1.  0.  0. 55.]
 		[ 0.  0.  1. 45.]
     ]

Конечно, это эффект отображения без сжатия, если сжато, то это матрица сжатия.

特征名字: ['city=上海', 'city=北京', 'city=南昌', 'template']
特征值:   (0, 1)	1.0
  		 (0, 3)	25.0
  		 (1, 0)	1.0
  		 (1, 3)	55.0
  		 (2, 2)	1.0
  		 (2, 3)	45.0

хорошо, тогда посмотрите прямо на код здесь:

from sklearn.feature_extraction import DictVectorizer

def DictVectorizer_Test():
    data = [{"city": "北京", "template": 25},
            {"city": "上海", "template": 55},
            {"city": "南昌", "template": 45}
            ]

    transfer = DictVectorizer()

    new_data = transfer.fit_transform(data)
    print("特征名字:",transfer.get_feature_names())
    print("特征值:",new_data)

Самое главное здесь - использовать этот DictVectorizer

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

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

Итак, что касается извлечения текста, sklearn в основном имеет две хорошо известные вещи, а при обработке текста он делится на обработку английского языка и обработку китайского языка.

по одному.

Горячее кодирование

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

Просто для примера:

data = ["life is short i like python","python is great but i prefer golan

Результат после обработки:

特征名字: ['but', 'golang', 'great', 'is', 'life', 'like', 				'prefer', 'python', 'short']
特征值: [
    	 [0 0 0 1 1 1 0 1 1]
 		 [1 1 1 1 0 0 1 1 0]
     	]

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

код

from sklearn.feature_extraction.text import CountVectorizer

def CountVertorizer_Test():
    data = ["life is short i like python","python is great but i prefer golang"]
    tranfer = CountVectorizer()
    new_data = tranfer.fit_transform(data)
    print("特征名字:",tranfer.get_feature_names())
    print("特征值:",new_data.toarray())

Обработка китайского текста

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

Здесь нам нужно использовать стороннюю библиотеку jieba

Эта штука в основном для китайской сегментации.

Перейдите непосредственно к коду:

def To_Chinese_World(worlds):

    """
    返回一个切个好的中文数组
    :param worlds:
    :return:
    """
    index = 0
    for word in worlds:
        worlds[index] = " ".join(list(jieba.cut(word)))
        index+=1
def CountVectorizer_Chinese(data):

    To_Chinese_World(data)

    tranfer = CountVectorizer()
    new_data = tranfer.fit_transform(data)

    print("特征名字:",tranfer.get_feature_names())
    print("特征值:",new_data.toarray())
if __name__ == '__main__':
    data = ["我爱大中华,我是中国人"]
    CountVectorizer_Chinese(data)

Обработка TF-IDF

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

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

Затем этот TF-IDF используется для обработки этого.

алгоритм

Правила работы этого алгоритма относительно просты. Например:

    data = [
        "water water water x",
        "apple apple apple x",
        "pear pear pear x",

    ]

Предполагая, что каждая строка является текстом, очевидно, что ключевое слово — один раз:

water apple pear

Итак, чтобы добиться этого эффекта, первая операция выглядит так

TF - та же частота, например, частота apple в "apple apple apple x" здесь 3/4

IDF — обратная частота документа, например apple, в какой из трех строк есть яблоко, здесь 1, тогда IDF = lg (3/1)

TF-IDF = TF * IDF

код

from sklearn.feature_extraction.text import TfidfVectorizer
def TFIDFVectorizerTest():
    data = [
        "water water water x",
        "apple apple apple x",
        "pear pear pear x",

    ]

    transfer = TfidfVectorizer()
    new_data = transfer.fit_transform(data)
    print("特征名字:",transfer.get_feature_names())
    print("特征值:",new_data.toarray())

результат:

特征名字: ['apple', 'pear', 'water']
特征值: [
    	[0. 0. 1.]
 		[1. 0. 0.]
 		[0. 1. 0.]
     	]

На первый взгляд, первое ключевое слово — вода и так далее.

На этом этапе вы можете самостоятельно реализовать простой классификатор статей.

предварительная обработка данных

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

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

Есть также много соответствующих алгоритмов нормализации, в зависимости от вас, самый простой из них:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hsquux7t-1636988903105)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115200610628.png)]

Это также наиболее типично, все данные находятся в диапазоне (0,1).

Соответствующий API

sklearn.preprocrssing.MinMaxScaler

Просто для примера:

from sklearn.preprocessing import MinMaxScaler, StandardScaler
import pandas as pd
def MinMaxScalerTest():
    """
    归一化
    :return:
    """
    # 1、获取数据只要前三列,\t 是为了正常输出
    data = pd.read_csv("dating.txt",sep="\t")
    data = data.iloc[:, :3]
    print("data:\n", data)

    # 2、实例化一个转换器类
    #transfer = MinMaxScaler(feature_range=[2, 3])
    transfer = MinMaxScaler(feature_range=[2, 3])
    #默认[0,1]

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

набор данных:

Ссылка на сайт:disk.baidu.com/is/1Q-4ZK BX3…Код извлечения: 6666

data:
      milage     Liters  Consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
995   11145   3.410627    0.631838
996   68846   9.974715    0.669787
997   26575  10.650102    0.866627
998   48111   9.134528    0.728045
999   43757   7.882601    1.3324



data_new:
 [[0.44832535 0.39805139 0.56233353]
 [0.15873259 0.34195467 0.98724416]
 [0.28542943 0.06892523 0.47449629]
 ...
 [0.29115949 0.50910294 0.51079493]
 [0.52711097 0.43665451 0.4290048 ]
 [0.47940793 0.3768091  0.78571804]]

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

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

х* = (х - μ ) / σ

где μ — среднее значение всех выборочных данных, а σ — стандартное отклонение всех выборочных данных.

также

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOVQT2nX-1636988903106)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115203659529.png)]

Стандартное отклонение нормализованных данных z-показателя равно 1.

Не беда, если вы не знаете, как настроить API.

sklearn.preprocrssing.StandarScaler

пример:

def StandardScalerTest():

    data = pd.read_csv("dating.txt",sep="\t")
    data = data.iloc[:, :3]
    print("data:\n", data)

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

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

На самом деле вы обнаружите, что правила вызова одинаковы, то есть операторы разные (по словам Флинка)

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

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

Поскольку то, с чем мы имели дело раньше, делается с помощью двумерных массивов, для многомерных мы должны попасть в двумерные массивы. Что-то вроде "пощечины". Другими словами, мы потеряем часть данных (уменьшим ненужные элементы помех данных, уменьшим избыточность данных) для достижения «выравнивания».

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

Большой народный язык: найдите основные черты в оригинальных чертах.

Метод фильтрации фильтра

набор данных:

Ссылка на сайт:Disk.Baidu.com/Yes/1U Home 6cur0P…Код извлечения: 6666

низкодисперсионная фильтрация

Рассчитайте дисперсию и отфильтруйте низкую дисперсию

from sklearn.feature_selection import VarianceThreshold


def VarianceThresholdTest():


    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2] #有些数据不要,有些列,例如第一列
    print("data:\n", data)

    transfer = VarianceThreshold(threshold=10)

    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new, data_new.shape)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQGNmN1i-1636988903107)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115210525226. png)]

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThUpU2vI-1636988903108)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115210935521.png)]

Вот пример:

from scipy.stats import pearsonr
# 计算某两个变量之间的相关系数
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense之间的相关性:\n", r2)

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

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

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

Например

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jEGtr1S8-1636988903108)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115212204022.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljeBPk0E-1636988903109)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115212325415.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQnADQ6E-1636988903109)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211115212406495.png)]

def PCATest():
    """
    PCA降维
    :return:
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]

    # 1、实例化一个转换器类
    transfer = PCA(n_components=0.95)
    # n_components=0.95 保留 95%特征 如果传入整数就是减少到多少空间也就是降到几维度  n_components=2

    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

резюме

Учитесь усердно, поднимайтесь каждый день и идите по выбранному вами пути!