Я в восторге от Scikit-learn. Я всегда использовал scikit-learn для моделирования данных и метрик. Но я понятия не имел, насколько разнообразной и полезной может быть эта библиотека! Итак, этот пост посвящен рассмотрению и восхвалению Scikit-learn.

Что такого особенного в scikit-learn?

Теперь, если вы настроены скептически и еще не изучили его возможности, вы, должно быть, думаете: «что это за шумиха?» «Итак, позвольте мне рассказать вам о причинах этой навязчивой идеи.

Все еще не убеждены? Теперь пришло время продемонстрировать его универсальность.

Scikit-Learn & Data:

Данные — это суть любого алгоритма машинного обучения, верно? Теперь реальные данные беспорядочны. Иногда нам может понадобиться парсить некоторые веб-сайты или собирать данные с помощью опросов, или проверять модули ERP на наличие таблиц, или просто медленно собирать данные с течением времени. Но иногда нам нужны данные, чтобы изучать, практиковать или исследовать алгоритмы машинного обучения. Для этой цели у scikit-learn есть простое в применении решение.

Встроенный набор данных:

В библиотеке scikit-learn есть множество встроенных наборов данных, простых и популярных для изучения. Итак, нам просто нужно импортировать модуль наборов данных, и вуаля! Вот пример:

import sklearn.datasets as datasets 
house_dtls = datasets.load_boston() 
print(house_dtls.data.shape) 
print(house_dtls.feature_names)

Реальный набор данных:

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

from sklearn.datasets import fetch_20newsgroups 
newsgroups_train = fetch_20newsgroups(subset='train') newsgroups_train.data[:1]

Создайте набор данных:

Также Scikit-learn может помочь в генерации искусственного набора данных для задач классификации, кластеризации или регрессии. Теперь, это удивительно, правда?

Классификация:

X,y = datasets.make_classification(n_features=20, 
                                   n_samples=100, 
                                   n_redundant=0, 
                                   n_informative=5, 
                                   n_clusters_per_class=1 
                                   ) 
print("The data X shape is {}".format(X.shape)) 
print("The data y shape is {}".format(y.shape))

Приведенный выше фрагмент кода создаст набор данных классификации со 100 записями и 20 функциями. И выходная переменная является двоичной. Что ж, есть еще один способ создать набор данных классификации с несколькими метками. Давайте быстро посмотрим.

A, b = datasets.make_multilabel_classification(n_classes=3,  
                                              allow_unlabeled=True,  
                                              random_state=1) print("The data X shape is {}".format(A.shape)) 
print("The data y shape is {}".format(b.shape))

Регрессия:

Теперь мы можем создать набор данных регрессии с помощью метода make_regression, аналогичного набору данных классификации. Вот пример:

X, y = datasets.make_regression(n_features=1, 
                                n_informative=1 
                               ) 
print("The regression data X shape is {}".format(X.shape)) print("The regression data y shape is {}".format(y.shape))

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

Теперь, когда у нас есть данные, пришло время очистить, масштабировать или нормализовать данные, что известно как предварительная обработка данных. Это очень важный шаг в машинном обучении, поскольку данные не поставляются в готовом к использованию пакете. Таким образом, пакет sklearn.preprocessing предоставляет несколько общих служебных функций и классов преобразования для преобразования необработанных векторов признаков в представление, более подходящее для построения модели машинного обучения. Итак, давайте посмотрим, как мы можем использовать sklearn для предварительной обработки данных.

Работа с числовым признаком

Мин-макс масштаб

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

xi — мин.(х) / макс.(х) — мин.(х)

from sklearn.preprocessing import MinMaxScaler 
data = [[-1, 72], [-0.5, -6], [90, 10], [10, 188]] 
scaler = MinMaxScaler() 
print("Fit: ", scaler.fit(data)) 
print("Max: ", scaler.data_max_) 
print("Transform: " , scaler.transform(data))

Стандартный масштабировщик

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

xi — среднее (x) / стандартное отклонение (x)

from sklearn.preprocessing import StandardScaler 
data = [[0, 0], [0, 0], [1, 1], [1, 1]] 
scaler = StandardScaler() 
print("Fit: ", scaler.fit(data)) 
print("Mean: ", scaler.mean_) 
print("Transform: " , scaler.transform(data))

Нормализоватьr

Еще одна важная функция масштабирования — Normalizer. Он работает со строками, а не со столбцами. Он масштабирует каждую выборку независимо от других выборок, так что ее норма (l1, l2 или inf) равна единичной норме. Теперь Единичная норма с L2 означает, что если каждый элемент возвести в квадрат и просуммировать, сумма будет равна 1.

from sklearn.preprocessing import Normalizer 
X = [[4, 1, 2, 2], [1, 3, 9, 3], [5, 7, 5, 1]] 
transformer = Normalizer().fit(X) 
transformer.transform(X)

Работа с категориальными признаками

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

Теперь, чтобы создать модель, мы преобразуем категориальный признак в целые числа. В scikit-learn для этого есть несколько вариантов.

OrdinalEncoder: этот оценщик преобразует каждую категориальную характеристику в одну новую целочисленную характеристику (от 0 до n_categories — 1).

import sklearn.preprocessing as preprocessing 
enc = preprocessing.OrdinalEncoder() 
X = [['male', 'from US', 'uses Safari'], 
     ['female', 'from Europe', 'uses Firefox']
    ] 
enc.fit(X) 
print("The original data") print(X) 
print("The transform data using OrdinalEncoder") print(enc.transform([['female', 'from US', 'uses Safari']]))

OneHotEncoder. Таким образом, этот оценщик преобразует каждый категориальный признак с возможными значениями n_categories в бинарные признаки n_categories, где один из них равен 1, а все остальные — 0.

import sklearn.preprocessing as preprocessing 
enc = preprocessing.OneHotEncoder() 
X = [['male', 'from US', 'uses Safari'], 
     ['female', 'from Europe', 'uses Firefox']] 
enc.fit(X) 
print("The original data") 
print(X) 
print("The transform data using OneHotEncoder") print(enc.transform([['female', 'from US', 'uses Safari'], ['male', 'from Europe', 'uses Safari']]).toarray())

LabelEncoder: теперь этот оценщик может помочь кодировать метки со значением от нуля до n_classes-1.

import sklearn.preprocessing as preprocessing 
import numpy as np 
targets = np.array(["Sun", "Sun", "Moon", "Earth", "Monn", "Venus"]) labelenc = preprocessing.LabelEncoder() 
labelenc.fit(targets) 
targets_trans = labelenc.transform(targets) 
print("The original data") 
print(targets) 
print("The transform data using LabelEncoder") 
print(targets_trans)

Sklearn и выбор функций

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

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

  1. Чтобы сократить время обучения
  2. Сделать Модель простой и легкой
  3. Уменьшить переоснащение и, следовательно, проклятие размерности

Есть несколько способов сделать выбор функций, и scikit-learn покрывает их все. Давайте быстро посмотрим!

Выберите k-лучшие функции

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

Приведенный ниже код выбирает 20 лучших функций, используя показатель chi2.

from sklearn.datasets import load_digits 
from sklearn.feature_selection import SelectKBest, chi2 
X, y = load_digits(return_X_y=True) 
print("Orginal Features Count: ", X.shape[1]) 
X_new = SelectKBest(chi2, k=20).fit_transform(X, y) 
print("Features count after using SelectKBest: ", X_new.shape[1])

Порог отклонения

Scikit-learn предоставляет VaranceThreshold для удаления функций с низкой дисперсией. Теперь, что это вообще значит? Это означает, что если функция имеет очень небольшое разнообразие значений, то она не будет сильно способствовать предсказанию цели в модели. В приведенном ниже примере Feature3 имеет одинаковое значение для всех записей. Другими словами, дисперсия признака3 равна нулю.

Теперь давайте посмотрим на пример кода:

import sklearn.feature_selection as fs 
import numpy as np 
X = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]) 
var = fs.VarianceThreshold(threshold=0.2) 
var.fit(X) 
X_trans = var.transform(X) 
print("The original data") 
print(X) 
print("The processed data by variance threshold") print(X_trans)

Scikit-learn & Feature Extraction:

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

Анализ текста:

Как и ожидалось, Scikit-learn предоставляет утилиты для наиболее распространенных способов извлечения числовых признаков из текстового содержимого. Они есть:

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

Теперь этот процесс преобразования необработанных текстовых документов в векторы числовых признаков называется векторизация.

from sklearn.feature_extraction.text 
import CountVectorizer 
counterVec = CountVectorizer() 
##corpus is a list of string in this example, such as: 
corpus = [ "I have an apple.", 
           "The apple is red", 
           "I like the apple", 
           "Apple is nutritous" 
         ] 
counterVec.fit(corpus) 
##corpus_data is a matrix with 0/1. 
corpus_data = counterVec.transform(corpus) 
print("Get all the feature names of this corpus") print(counterVec.get_feature_names()) 
print("The number of feature is {}".format(len(counterVec.get_feature_names()))) 
corpus_data = counterVec.transform(corpus) 
print("The transform data's shape is {}".format(corpus_data.toarray().shape)) 
print(corpus_data.toarray())

Анализ изображения:

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

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

import numpy as np from sklearn.feature_extraction 
import image 
one_image = np.arange(4 * 4 * 3).reshape((4, 4, 3)) 
one_image[:, :, 0] # R channel of a fake RGB picture 
patches = image.extract_patches_2d(one_image, (2, 2),  
                                   max_patches=2,
                                   random_state=0) 
print(patches.shape) 
print(patches[:, :, :, 0]) 
patches = image.extract_patches_2d(one_image, (2, 2)) print(patches.shape) print(patches[4, :, :, 0])

Вывод:

До сих пор я говорил о функциях scikit-learn, которые важны и полезны. Помимо этого, scikit-learn широко используется для обучения и создания различных моделей машинного обучения, а также для оценки этих моделей. Ну, это может быть разговор на другой день.

Короче говоря, полезно знать, что если вы боретесь с набором данных и не знаете, с чего начать, просто взгляните на документацию scikit-learn. Уверен, там будет что-то полезное.

Кроме того, я загрузил код, который я запускал выше, в моем месте Github. Вы можете посмотреть, если какой-либо из приведенных выше кодов не работает для вас.

Итак, теперь вы уверены, что Scikit-learn — универсальное решение на Python в мире машинного обучения? Еще нет? Значит, мне нужно привести еще какие-то доказательства? Хорошо, я скоро вернусь с некоторыми проектами, в которых sklearn играет главную роль.

На сегодня, Спасибо за чтение!

Первоначально опубликовано на https://oindrilasen.com 2 февраля 2021 г.