Сквозное прохождение общих алгоритмов классификации; включая случайный лес, полиномиальный наивный байесовский анализ, логистическую регрессию, kNN и SVM из sklearn

Оглавление

  1. Вступление
  2. Случайный лес
  3. Полиномиальный наивный байесовский
  4. Логистическая регрессия
  5. Машины опорных векторов
  6. K-ближайший сосед
  7. Резюме
  8. использованная литература

Вступление

Цели этой статьи:

1. Изучите общие науки о данных, алгоритмы классификации.

2. Выполните пример кода этих алгоритмов.

Хотя есть несколько документов и статей об алгоритмах машинного обучения, я хотел бы дать краткое изложение наиболее распространенных из них, которые я использую как профессиональный специалист по данным. Кроме того, я добавлю несколько примеров кода с фиктивными данными, чтобы вы могли приступить к выполнению различных моделей! Ниже я опишу эти основные алгоритмы классификации из любимой библиотеки sklearn (также называемый scikit-learn) [2]:

  • случайный лес (RandomForestClassifier) - можно использовать для регрессии
  • полиномиальный наивный байесовский (MultinomialNB)
  • логистическая регрессия (LogisticRegression)
  • поддержка векторных машин (svm) - может использоваться для регрессии
  • k-ближайшие соседи (KNeighborsClassifier) - можно использовать для регрессии

Что такое классификация?

Assigning new data into a category or bucket. 

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

Этикетки: фрукты - банан, апельсин и яблоко

Характеристики: форма, размер, цвет, количество семян и т. д.

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

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

Случайный лес

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

n_estimators: number of trees in your forest (100)
max_depth: maximum depth of your tree (None) - recommendation, change this parameter to be an actual number because this parameter could cause overfitting from learning your traning data too well
min_samples_split: minimum samples required to split your node (2)
min_samples_leaf: mimimum number of samples to be at your leaf node (1)
max_features: number of features used for the best split ("auto")
boostrap: if you want to use boostrapped samples (True)
n_jobs: number of jobs in parallel run (None) - for using all processors, put -1
random_state: for reproducibility in controlling randomness of samples (None)
verbose: text output of model in process (None)
class_weight: balancing weights of features, n_samples / (n_classes * np.bincount(y)) (None) - recommendation, use 'balanced' for labels that are unbalanced

Я приведу здесь пример алгоритма случайного леса. Он будет использовать фиктивные данные (поэтому точность для меня не имеет значения). Основное внимание уделяется коду, концепции, а не точности, если ваши входные данные не установлены хорошо. В примере кода будет пять отдельных строк, в которых вы можете закомментировать все классификаторы, clf , кроме одного - того, который вы тестируете. Ниже приведен основной пример кода [4]:

# import libraries
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn import svm
from sklearn import metrics
import pandas as pd
# text and numeric classes that use sklearn base libaries
class TextTransformer(BaseEstimator, TransformerMixin):
    """
    Transform text features
    """
    def __init__(self, key):
        self.key = key
def fit(self, X, y=None, *parg, **kwarg):
        return self
def transform(self, X):
        return X[self.key]
    
class NumberTransformer(BaseEstimator, TransformerMixin):
    """
    Transform numeric features
    """
    def __init__(self, key):
        self.key = key
def fit(self, X, y=None):
        return self
def transform(self, X):
        return X[[self.key]]
# read in your dataframe
df = pd.read_csv('/Users/data.csv')
# take a look at the first 5 observations
df.head()
# use the term-frequency inverse document frequency vectorizer to transfrom count of text
# into a weighed matrix of term importance
vec_tdidf = TfidfVectorizer(ngram_range=(1,1), analyzer='word', norm='l2')
# compile both the TextTransformer and TfidfVectorizer 
# to the text 'Text_Feature' 
color_text = Pipeline([
                ('transformer', TextTransformer(key='Text_Feature')),
                ('vectorizer', vec_tdidf)
                ])
# compile the NumberTransformer to 'Confirmed_Test', 'Confirmed_Recovery', 
# and 'Confirmed_New' numeric features
test_numeric = Pipeline([
                ('transformer', NumberTransformer(key='Confirmed_Test')),
                ])
recovery_numeric = Pipeline([
                ('transformer', NumberTransformer(key='Confirmed_Recovery')),
                ])
new_numeric = Pipeline([
                ('transformer', NumberTransformer(key='Confirmed_New')),
                ])
# combine all of the features, text and numeric together
features = FeatureUnion([('Text_Feature', color_text),
                      ('Confirmed_Test', test_numeric),
                      ('Confirmed_Recovery', recovery_numeric),
                      ('Confirmed_New', new_numeric)
                      ])
# create the classfier from list of algs - choose one only
clf = RandomForestClassifier()
clf = MultinomialNB()
clf = LogisticRegression()
clf = svm.SVC()
clf = KNeighborsClassifier()
# unite the features and classfier together
pipe = Pipeline([('features', features),
                 ('clf',clf)
                 ])
# transform the categorical predictor into numeric
predicted_dummies = pd.get_dummies(df['Text_Predictor'])
# split the data into train and test
# isolate the features from the predicted field
text_numeric_features = ['Text_Feature', 'Confirmed_Test', 'Confirmed_Recovery', 'Confirmed_New']
predictor = 'Text_Predictor'
X_train, X_test, y_train, y_test = train_test_split(df[text_numeric_features], df[predictor], 
                                                    test_size=0.25, random_state=42)
# fit the model
pipe.fit(X_train, y_train)
# predict from the test set
preds = pipe.predict(X_test)
# print out your accuracy!
print("Accuracy:",metrics.accuracy_score(y_test, preds))

Вот код из моей статьи на GitHub, если вы хотите увидеть, как он выглядит на Python в формате .py [4]: ​​

Полиномиальный наивный байесовский

Этот классификатор является наивным байесовским, который предназначен для полиномиальных моделей, как следует из названия алгоритма. Он широко используется в задачах классификации текста, где текст является функцией подсчета слов. При использовании этого алгоритма рекомендуется использовать конвейер обратная частота документа (td-idf), так как вам нужна хорошо распределенная функция. Поскольку этот классификатор основан на теореме Байеса, предполагается, что между функциями существует независимость. Вот основной код классификатора:

clf = MultinomialNB()

Параметры и атрибуты используемой модели:

parameters - 
alpha: a paramter for smoothing (1.0)
class_prior: looking at the previous class probability (None) 
attributes -
feature_count: number of samples for each class or feature (number of classes, number of features)
n_features: number of features for sample

Логистическая регрессия

Логистическая регрессия, или более похожая на логистическую классификацию, - это алгоритм, в котором используется функция logit. Оценки обычно представляют собой двоичные значения, такие как истина - ложь, да - нет и 0–1. Логистическая функция также использует сигмовидную функцию. Есть много статей о специфике этой модели (см. Полезные ссылки ниже), но я выделю, как вместо этого выполнять код в библиотеке sklearn. Вот основной код классификатора:

clf = LogisticRegression()

Логистическая регрессия имеет множество важных параметров. Вот несколько из них:

penalty: l1 or l2 (lasso or ridge), the normality of penalization (l2)
multi_class: binary versus multiclass label data ('auto')

Машины опорных векторов

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

clf = svm.SVC()

Это различие в коде ссылается на добавленный SVC, который является классификацией C-опорных векторов. Для мультиклассовых ситуаций вы можете использовать параметр:

parameter - 
decision_function_shape: 'ovr' or 'one-versus-rest' approach

K-Ближайшие соседи

K-ближайших соседей, или KNN, работает большинством голосов. Он классифицирует новые классы на основе тех соседей, которых он окружает; обычно используется евклидова функция измерения расстояния. Код, используемый для этого алгоритма:

clf = KNeighborsClassifier()

Наиболее важным параметром, пожалуй, является:

parameter - 
n_neighbors: number of neighbors (5)

Резюме

Хотя есть масса статей об широко используемых алгоритмах машинного обучения;

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

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

использованная литература

[1] Фото JOHN TOWNER на Unsplash, (2016)

[2] sklearn, sklearn, (2020)

[3] Фото Lukasz Szmigiel на Unsplash, (2015)

[4] Прыбыла М., Классификация-модели, (2020)

[5] Фото Патрика Томассо на Unsplash, (2016)

[6] Фото Christian Stahl на Unsplash, (2017)

Полезные ссылки sklearn:

Случайный лес

Полиномиальный наивный байесовский

"Логистическая регрессия"

Машины опорных векторов

K-Ближайшие соседи