Сквозное прохождение общих алгоритмов классификации; включая случайный лес, полиномиальный наивный байесовский анализ, логистическую регрессию, kNN и SVM из sklearn
Оглавление
- Вступление
- Случайный лес
- Полиномиальный наивный байесовский
- Логистическая регрессия
- Машины опорных векторов
- K-ближайший сосед
- Резюме
- использованная литература
Вступление
Цели этой статьи:
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:
Полиномиальный наивный байесовский
"Логистическая регрессия"