Use Scikit-learn
通过昨天对分类算法的大概了解,我们现在可以尝试进行一次简单的实践,使用sklearn这个库来进行模型训练
本质上,在sklearn库里,如果我们要分类,有很多可以选择的算法,这第一个算法我们选择逻辑回归模型,这个玩意涵盖了包括决策树在内的一系列模型,要使用这个东西,那么我们需要注意的是两个重要参数: multi_class
和 solver
multi_class
是选择的模型,这里给出的例子有两个
-
One-vs-rest(OVR,这个就是One-vs-all),需要将multi_class设置为ovr
-
Corss-entropy loss(交叉熵),就要将multi_class设置为multinominal
solver
是实际用来实现模型的算法,一个模型可以用多种算法去实现,每一种都有自己的特点,像交叉熵就提供了lbfgs
sag
saga
newton-cg
之类的算法,在sklearn提供的范围内,下面这些事常见的
现在我们使用sklearn来训练数据,操作很方便
lr = LogisticRegression(multi_class="ovr", solver="liblinear")
model = lr.fit(X_train, np.ravel(Y_train))
accuracy = model.socre(X_test, Y_test)
print(accuracy)
其中 np.reval
就是简单地将多维数据缩放到一维,在上面那个例子里,如果使用昨天清理好的训练集,准确率可以达到 80%,很不错的一个数据(其实差点)
那么OVR是如何分类的呢?我们可以大概理解为百分比,我们可以从测试集里随便取点数据出来
test = X_test.iloc[50].values.reshape(-1, 1).T
这样随便取了一行,然后用模型进行分类
proba = model.predict_proba(test) #预测百分比
classes = model.classes_ #获取有哪些分类
resultdf = pd.DataFrame(data=proba, columns=classes)
现在,resultdf
就包含了各个分类的百分比,结果如下
0 | |
---|---|
indian | 0.715851 |
chinese | 0.229475 |
japanese | 0.029763 |
korean | 0.017277 |
thai | 0.007634 |
因此,OVR模型认为,test这道菜是印度料理,也就完成了分类,剩下几种分类其实也差不多,就简单贴一下代码了
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
import numpy as np
C = 10
# Create different classifiers.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0),
'KNN classifier': KNeighborsClassifier(C),
'SVC': SVC(),
'RFST': RandomForestClassifier(n_estimators=100),
'ADA': AdaBoostClassifier(n_estimators=100)
}
今天因为还有别的一些事情,就只写了这么一点了,明天见~
原文始发于微信公众号(衡阳信安):机器学习之模型训练