机器学习的入门指南。使用多种ML算法对传奇小精灵进行二元分类
Siddharth1698 ,2021年8月6日
文章视频书
这篇文章是作为数据科学博客马拉松的一部分发表的。
简介
机器学习被广泛用于现实世界场景中的不同问题。其中一个主要问题包括分类。分类可以是二元分类,也可以是多元分类。在这篇文章中,我们将深入探讨二进制分类。我们将首先了解二进制分类,然后应用不同的ML算法,看看我们能多准确地对目标进行分类。
在这个教程中,我将使用口袋妖怪的统计资料数据集。在这里,我们有所有小精灵的统计资料,我们将尝试准确地分类小精灵是否是传说中的。如果你不知道,传说中的小精灵是那些非常罕见和强大的小精灵。我们很想知道,这些特征、统计资料是否有助于我们对它们进行分类。
来源。 makeameme.org/meme/when-y…
什么是分类?
在机器学习领域,分类指的是将数据分离到不同的类别标签。对于我们的数据集中的特定行或特征值,我们感兴趣的是将它们与一个特定的目标值联系起来。这在许多应用中被广泛使用,比如说你是否收到垃圾邮件。图片是否是假的。如果有两个以上的类标签,我们称之为多类分类。
在我们的案例中,我们只处理两类传奇或非传奇的小精灵。所以我们有一个二元分类问题。问题是我们如何实际衡量准确度。我们这里有一个罗伯特-阿尔特曼(Robert Alterman)的混淆矩阵,它可以帮助我们判断我们所做的分类是正确还是错误。这里的这张图片是可视化传奇小精灵混淆矩阵的最佳方式之一。
来源:towardsdatascience.com/gotta-class…
在我们混淆矩阵的第一个对角线上,我们可以找到完全预测的数值。将它们相加并与矩阵内的所有数值相除,就能得到预测的准确性。
现在让我们深入了解不同的机器学习算法。在本教程中,我的意图是向你展示每种算法的编码。完整的预处理和编码以及所有代码都可以在这个COLAB链接中找到。
我们的数据集。
数据集可以在这里找到。
对于分类问题,我们使用了这个数据集,它有一个传奇列,告诉我们小精灵是否是传奇的真或假。在进入下一步之前,我们使用标签编码,将真编码为1,假编码为0。列#、名称、类型1和类型2不是必需的,并且作为预处理步骤的一部分从数据集中删除。用于ML算法的最终数据集看起来像这样。
我们可以看到这里有8列被用作特征,最后一列是我们的Legendary,它代表了要预测的目标变量。
探索性数据分析。
1.不同类型的小精灵的分布情况是怎样的?
正如我们在这里看到的,与其他所有的小精灵相比,水精灵非常普遍。岩石和电系小精灵则较少出现。
2.每个小精灵的特征有多大的关联性?
从热图中可以看出,小精灵的属性之间没有太大的关联性。我们可以看到最高的是特殊攻击和总数之间的相关性。
3.各代火系小精灵的攻击与防御。
第5代往往有较低的防御。第5代小精灵中的一个是最好的攻击者。
机器学习算法。
来源:miro.medium.com/max/1400/1\…
Logistic回归。
Logistic回归被广泛用于二进制分类。它使用logit函数来表示结果。通过使用sigmoid激活函数,在输出中产生一个概率,并将其分类为0或1。sigmoid函数如下。
Y = 1 / 1+e-z
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train,Y_train)
Y_pred_lr = lr.predict(X_test)
score_lr = round(accuracy_score(Y_pred_lr,Y_test)*100,2)
print("The accuracy score we have achieved using Logistic Regression is: "+str(score_lr)+" %")
使用逻辑回归取得的准确率是:93.12 %。
高斯奈夫贝叶斯。
Naive Bayes是一种利用贝叶斯定理的概率算法。我们可以把它说成
如果B是真的,A的概率等于B的概率,如果A是真的,乘以A是真的概率,除以B是真的概率。
from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(X_train,Y_train)
Y_pred_nb = nb.predict(X_test)
score_nb = round(accuracy_score(Y_pred_nb,Y_test)*100,2)
print("The accuracy score we have achieved using Naive Bayes is: "+str(score_nb)+" %")
使用Naive Bayes取得的准确率分数是91.88 %
支持向量机。
支持向量机是有监督的ML算法,用于解决分类问题。我们在这里画一个超平面,试图将两个不同的类分开。更复杂的数据,我们可以使用SVM算法产生更好的结果。该算法可以训练大型数据集,但本质上往往比较慢。
from sklearn import svm
sv = svm.SVC(kernel='linear')
sv.fit(X_train, Y_train)
Y_pred_svm = sv.predict(X_test)
score_svm = round(accuracy_score(Y_pred_svm,Y_test)*100,2)
print("The accuracy score we have achieved using Linear SVM is: "+str(score_svm)+" %")
使用线性SVM达到的准确率是:94.38 %。
K-最近的邻居。
K-NN是一种最近的邻居分类算法。它试图分配离邻居最近的点。在KNN中发生投票,靠近点的邻居赢得了这个点。这里的K表示我们模型中可用的邻居的数量。
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=7)
knn.fit(X_train,Y_train)
Y_pred_knn=knn.predict(X_test)
score_knn = round(accuracy_score(Y_pred_knn,Y_test)*100,2)
print("The
使用KNN达到的准确率是:96.25 %。
决策树。
决策树类似于一个问题回答系统,它根据一个特定的条件来决定把点放在哪个孩子身上。基本上,它就像一个流程图,一次将数据点分成两类,从 "树干 "到 "树枝",再到 "树叶",每个类别中的数据根据相似度进行分割。
from sklearn.tree import DecisionTreeClassifier
max_accuracy = 0
for x in range(200):
dt = DecisionTreeClassifier(random_state=x)
dt.fit(X_train,Y_train)
Y_pred_dt = dt.predict(X_test)
current_accuracy = round(accuracy_score(Y_pred_dt,Y_test)*100,2)
if(current_accuracy>max_accuracy):
max_accuracy = current_accuracy
best_x = x
#print(max_accuracy)
#print(best_x)
使用决策树达到的准确率是:96.25 %。
随机森林。
随机森林是决策树的扩展,它主要解决了决策树的缺点,即不必要地将数据点强行归入一个有点不正确的类别。
它的工作原理是,最初用可用的训练数据构建决策树,然后将未见过的数据装入其中一棵树中,作为 "随机森林"。它对我们的数据进行平均,将其连接到数据比例上最近的树。
from sklearn.ensemble import RandomForestClassifier
max_accuracy = 0
for x in range(2000):
rf = RandomForestClassifier(random_state=x)
rf.fit(X_train,Y_train)
Y_pred_rf = rf.predict(X_test)
current_accuracy = round(accuracy_score(Y_pred_rf,Y_test)*100,2)
if(current_accuracy>max_accuracy):
max_accuracy = current_accuracy
best_x = x
#print(max_accuracy)
#print(best_x)
rf = RandomForestClassifier(random_state=best_x)
rf.fit(X_train,Y_train)
Y_pred_rf = rf.predict(X_test)
score_rf = round(accuracy_score(Y_pred_rf,Y_test)*100,2)
print("The
使用决策树取得的准确率是:98.12 %。
XG-Boost。
XGBoost主要是一种梯度提升决策树的实现,用于加速提升分类的性能。
import xgboost as xgb
xgb_model = xgb.XGBClassifier(objective="binary:logistic", random_state=42)
xgb_model.fit(X_train, Y_train)
Y_pred_xgb = xgb_model.predict(X_test)
score_xgb = round(accuracy_score(Y_pred_xgb,Y_test)*100,2)
print("The accuracy score we have achieved using XGBoost is: "+str(score_xgb)+" %")
使用XGBoost取得的准确率是。96.88 %
神经网络。
神经网络是模仿人脑的网络。在这里,我们构建了一个具有32层隐藏层的神经网络。由于我们有8个特征,我们将其作为输入维度。在最后一层,我们使用sigmoid,因为它是一个二进制分类问题。在这中间,我们使用ReLU作为激活函数。
from keras.models import Sequential
from keras.layers import Dense
import tensorflow as tf
model = Sequential()
model.add(Dense(32,activation='relu',input_dim=8))
model.add(Dense(1,activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(X_train,Y_train,epochs=100, callbacks = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3))
Y_pred_nn = model.predict(X_test)
rounded = [round(x[0]) for x in Y_pred_nn]
Y_pred_nn = rounded
score_nn = round(accuracy_score(Y_pred_nn,Y_test)*100,2)
print("The accuracy score we have achieved using Neural Network is: "+str(score_nn)+" %")
使用神经网络取得的准确率是:90.62 %。
结果。
在各种ML算法上运行我们的小精灵特征后,我们可以发现XG-boost算法在我们的案例中效果很好,准确率为96.88%,其次是随机森林,准确率为96.12%。神经网络对于目前这个问题来说并不是那么好。但我们可以通过玩不同的隐藏层或使用一些复杂的模型来获得更好的结果。
参考资料。
- www.kaggle.com/jashsheth5/…
- towardsdatascience.com/gotta-class…
- www.kaggle.com/thebrownvik…
- 图片:unsplash.com/photos/DypO…
结论。
_资料来源:XGBoost。_www.usgamer.net/articles/po…
**关于我:**我是一名对深度学习和自然语言处理领域感兴趣的研究学生,目前正在攻读人工智能的研究生课程。
欢迎通过以下方式与我联系。
1.Linkedin:www.linkedin.com/in/siddhart…
2.Github:github.com/Siddharth16…
本文所展示的媒体不属于Analytics Vidhya所有,由作者自行决定使用。
[
下一篇文章
在非结构化数据上实现人工神经网络
](www.analyticsvidhya.com/blog/2021/0…
上一篇
数据科学家在Python中高效编码的5种方法
](www.analyticsvidhya.com/blog/2021/0…)