Конечная цель путешествия по машинному обучению — достичь этапа, на котором можно применять методы, изученные на наборах данных, которые до сих пор никто не пробовал, или на ваших собственных данных. Другими словами, решить новую проблему, которая еще не решена. Данные MNIST и Iris хороши, но хороши только для начала пути. Но тогда какие наборы данных следует использовать? Получение фактических данных для реальных проблем может быть дорогим, а иногда может быть даже неосуществимым, однако мы можем легко «создавать» или «моделировать» данные с помощью таких инструментов, как Numpy.

В этой статье мы создадим набор данных результатов экзаменов для 1000 учащихся (вы можете легко изменить число) по шести предметам в диапазоне от 1 до 100 (выбирается случайным образом с помощью Numpy.Random). Студент считается неудовлетворительным по предмету, если он набирает менее 33 баллов, и считается неудовлетворительным, если не проходит по 2 или более предметам. Мы обозначаем неудачу с «0» и пройдены с меткой «1». Теперь у нас есть набор данных, готовый к бинарной классификации с некоторым сложным правилом, которое, как мы ожидаем, выучит наш классификатор.

Теперь для многоклассовой классификации мы помещаем учащегося в одну из четырех категорий 0, 1, 2 и 3, если он получает общие оценки менее 33 %, более 60 %, от 60 до 45 % и от 45 до 33 % соответственно.

Мы используем следующие пять классификаторов из Scikit-Learn для задачи классификации.

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

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

3. Наивный Байес

4. Дерево решений

5. K-ближайшие соседи

Производительность классификатора измеряется с точки зрения матриц путаницы.

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

1. Создание данных

Обратите внимание, что мы будем использовать следующие две библиотеки Numpy и Pandas для создания данных. Мы используем фрейм данных Pandas для хранения и обработки данных.

import numpy as np
import pandas as pd
def get_exam_data ():
    # create marks for six subjects in the range 0-50
    subjects =      ["Hindi","English","Science","Maths","History","Geograpgy"]
    # set the seed 
    np.random.seed(seed=167)
    # set the marks randomly
    marks = np.random.randint(100, size=(1000,6))
    df = pd.DataFrame(data=marks, columns=subjects)
    df['Total'] =  df[subjects].sum(axis=1)
    # this is to find whether the student is failed or passed
    # in a subject 
  
    df1 = df.copy()
    # set the result fail is marks in a subject < 17
    for s in subjects:
       df1[s] =[1 if i > 33 else 0 for i in  df[s].tolist()]
    # get the total 
    df1['Results'] =  df1[subjects].sum(axis=1)
    # declare the result fail (0) if fail in more than 2 subjects
    df['Results'] = df1['Results'].apply(lambda x : 0 if x <=4 else 1)
    # get the divison :  1  for > 60 %, 2 for > 45 % and < 60 %, 3 for  < 45 % and > 33 %, # 0 for < 33 %
    df['Div'] = [1 if i > 360  else 2 if i < 360 and i > 270
     else 3 if i < 270 and i > 198 else 0 for i in df['Total'].tolist() ]
    # return the result data frame
    return df

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

Программа вызова вышеуказанной функции очень проста:

if __name__ == “__main__”:
   df = get_exam_data ()
   df.to_csv(“results.csv”)

Теперь мы создали данные, записанные в CSV-файл, который мы можем использовать для целей классификации.

Вот некоторые из первых нескольких строк данных:

Вы можете получить полный файл данных здесь.

2. Классификация

Сначала мы импортируем необходимые библиотеки:

import sys
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn import svm
from sklearn import tree
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn import neighbor

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

# 1. This is for Support Vector Machines
def svm_clf (x_train, y_train):
    print(“SVM Classifier”)
    #clf = svm.LinearSVC()
    #clf = svm.SVC(kernel=’rbf’)
    clf = svm.SVC(kernel=’poly’, degree=8)
    clf.fit(x_train, y_train)
    return clf
# 2. This is for Logistic Regression
def logistic_clf (x_train, x_test):
    print(“Logistic Classifier”)
    clf = LogisticRegression(C=1e5)
    clf.fit(x_train, y_train)
    return clf
#3. This is for Naive Bayes
 
def naive_bayes (x_train, x_test):
    print(“Naive Bayes Classifier”)
    clf = GaussianNB()
    clf.fit(x_train, y_train)
    return clf
#4. This is for Decision Tree
def tree_clf (x_train, y_train):
    print(“Decision Tree Classifier”)
    clf = tree.DecisionTreeClassifier(criterion=’entropy’)
    clf.fit(x_train, y_train)
    return clf
# 5. This is knn classifier
def knn_clf (x_train, y_train):
    print(“KNN Classifier”)
    n_neighbors = 15
    clf = neighbors.KNeighborsClassifier(n_neighbors,    weights=’uniform’)
    clf.fit(x_train, y_train)
    return clf

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

Основная программа следующая:

if __name__ == “__main__”:
  # Read the data file from sys.argv please change it if you wish 
  df = pd.read_csv(sys.argv[1])
  print(“Input data frame:”, df.shape)
  print(“Columns:”, df.columns)
  data = df.to_numpy()
  X = data[:,1:7]
  # for binary set
  #Y = data[:,8]
  # for multi-class
  Y = data[:,9]
  x_train, x_test, y_train, y_test \
    = train_test_split(X, Y, test_size=0.20, random_state=42)
  models = [svm_clf, logistic_clf, naive_bayes, tree_clf, knn_clf]
  conf_mat = []
   # Let us iterate over all the five classifiers 
  for m in models:
     clf = m(x_train, y_train)
     # Now make the prediction 
     y_hat = clf.predict(x_test)
     # Create the confusion matrix from the 
     # true value and predicted ones
     cm = confusion_matrix(y_test, y_hat)
     print(“Confusion matrix:\n”, cm)
     print(“========”)

3. Точность

мы можем сообщить о точности классификаторов с точки зрения матрицы путаницы, которая в основном говорит о том, сколько «0» было предсказано «0», а сколько «1» и сколько «1» было предсказано «0» и сколько «1» .

Для двоичного случая мы получаем следующие матрицы путаницы:

Для случая с несколькими классами мы получаем следующие матрицы путаницы:

4. Выводы :

В этой статье мы обсудили пять разных классификаторов, реализованных в Scikit-learn для смоделированного набора данных экзаменационных оценок для 1000 студентов. Мы видим, что даже с установкой параметров по умолчанию мы можем получить вполне приемлемые результаты. Однако можно улучшить результаты, настроив гиперпараметры.

Если вы найдете эту статью, пожалуйста, поставьте лайк (хлопайте в ладоши!) Полный код вы можете получить здесь.

5. Ссылки:

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

Классификация ближайших соседей

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

Деревья решений

Наивный Байес

Данные о результатах экзамена