@[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 умерла бы.
Есть также много соответствующих алгоритмов нормализации, в зависимости от вас, самый простой из них:
Это также наиболее типично, все данные находятся в диапазоне (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]]
стандартизация
Поскольку нормализация легко нарушается из-за больших данных и имеет низкую стабильность (в сценариях с большими различиями в данных), у нас есть еще один метод, называемый нормализацией.
х* = (х - μ ) / σ
где μ — среднее значение всех выборочных данных, а σ — стандартное отклонение всех выборочных данных.
также
Стандартное отклонение нормализованных данных 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)
png)]
Коэффициент корреляции
Мы хотим избежать избыточности, поэтому коэффициент корреляции слишком близок, чтобы его можно было обработать напрямую, а затем передать
Как найти этот коэффициент корреляции, взять характеристики каждой пары как x, y и затем найти коэффициент корреляции. Как это рассчитать, поищите на Baidu или спросите у школьного учителя математики.
Вот пример:
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
Большой народный язык: многомерные становятся низкоширотными, но в этом процессе исходные данные могут быть отброшены и могут быть созданы новые данные, которые могут привести к потере информации. Роль заключается в сжатии данных, применении, кластерном анализе, регрессионном анализе.
Например
Теперь сожмите это до прямой линии и постарайтесь как можно ближе подогнать исходный элемент.
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)
резюме
Учитесь усердно, поднимайтесь каждый день и идите по выбранному вами пути!