Конечная цель путешествия по машинному обучению — достичь этапа, на котором можно применять методы, изученные на наборах данных, которые до сих пор никто не пробовал, или на ваших собственных данных. Другими словами, решить новую проблему, которая еще не решена. Данные 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. Ссылки:
Классификация ближайших соседей
"Логистическая регрессия"