1. 决策树实现基本的分类
from sklearn import datasets
X, y = datasets.make_classification(n_samples=1000, n_features=3, n_redundant=0)
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(X, y)
predictions = dt.predict(X)
(y - predictions).mean()
>>>0.0
max_depth 这是个重要的参数,决定了允许多少分支。如果我们仅仅使用基本的决策树实现,可能拟合得不是很好。所以我们需要调参,以便获得更好的拟合。这非常简单,并且不用花费什么精力。
决策树经常会过拟合,所以,我们需要思考,如何避免过拟合,这是为了避免复杂性。修改max_depth,将熵用作分割标准criterion='entropy',设置min_samples_leaf=10等等
2. 随机森林--使用许多决策树
随机森林通过构造大量浅层树,之后让每颗树为分类投票,再选取投票结果。随机森林对于过拟合非常健壮,并且在大量场景中表现良好,所以使用它。
from sklearn import datasets
X, y = datasets.make_classification(1000)
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(X, y)
accuracy = (y == rf.predict(X)).mean()
correct_num = (y == rf.predict(X)).sum()
print('Accuracy:%f, Correct:%d' % (accuracy, correct_num))
>>>Accuracy:0.996000, Correct:996
rf.criterion :这是决定分割的标准。默认是 gini 。rf.bootstrap :布尔值,表示在训练随机森林时是否使用启动样例
rf.n_jobs :训练和预测的任务数量。如果你打算使用所有处理器,将其设置为 -1 。要记住,如果你的数据集不是非常大,使用过多任务通常会导致浪费,因为处理器之间需要序列化和移动。
rf.max_features :这表示执行最优分割时,考虑的特征数量。在调参过程中这会非常方便。
rf.conpute_importtances :这有助于我们决定,是否计算特征的重要性。
rf.max_depth :这表示树的深度。
特征重要性是随机森林的不错的副产品。这通常有助于回答一个问题:如果我们拥有 10 个特征,对于判断数据点的真实类别,哪个特征是最重要的?真实世界中的应用都易于观察。例如,如果一个事务是不真实的,我们可能想要了解,是否有特定的信号,可以用于更快弄清楚事务的类别。
3. 支持向量机(SVM)对数据分类
from sklearn import datasets
X, y = datasets.make_classification()
from sklearn.svm import SVC
base_svm = SVC()
base_svm.fit(X, y)
>>SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
C :以防我们的数据集不是分离好的, C 会在间距上放大误差。随着 C 变大,误差的惩罚也会变大,SVM 会尝试寻找一个更窄的间隔,即使它错误分类了更多数据点。class_weight :这个表示问题中的每个类应该给予多少权重。这个选项以字典提供,其中类是键,值是与这些类关联的权重。
gamma :这是用于核的 Gamma 参数,并且由 rbf, sigmoid 和 ploy 支持。
kernel :这是所用的核,我们在下面使用 linear 核,但是 rbf 更流行,并且是默认选项。
4. 使用多类分类来归纳
svm.SVC 支持向量机分类是一个很有效的分类方式,但是其只对2分类有效,不过,可以将多分类经过多次2分类最终实现多分类,而sklearn中的multiclass包就可以实现这种方式,减少我们重复造轮子。
import numpy as np
from sklearn.datasets import load_digits
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
from sklearn.model_selection import train_test_split
digits = load_digits()
x, y = digits.data, digits.target
y = label_binarize(y, classes=list(range(10)))
x_train, x_test, y_train, y_test = train_test_split(x, y)
model = OneVsRestClassifier(svm.SVC(kernel='linear'))
clf = model.fit(x_train, y_train)
In [236]: clf.score(x_train, y_train)
Out[236]: 0.97475872308834444
In [237]: clf.score(x_test, y_test)
Out[237]: 0.85999999999999999
In [242]: np.argmax(y_test, axis=1)
Out[242]: array([0, 0, 2, ..., 5, 6, 7], dtype=int64)
In [243]: np.argmax(clf.decision_function(x_test), axis=1)
Out[243]: array([0, 0, 2, ..., 5, 6, 7], dtype=int64)
5. 使用随机梯度下降(SGD)来分类
from sklearn import datasets
X, y = datasets.make_classification()
from sklearn import linear_model
sgd_clf = linear_model.SGDClassifier()
sgd_clf.fit(X, y)
6. 使用朴素贝叶斯来分类数据
import numpy as np
from sklearn.naive_bayes import GaussianNB
X = np.array([[-1, -1], [-2, -2], [-3, -3],[-4, -4],[-5, -5], [1, 1], [2, 2], [3, 3]])
y = np.array([1, 1, 1, 1, 1, 2, 2, 2])
# 默认priors=None
clf = GaussianNB()
clf.fit(X,y)
>>>GaussianNB(priors=None)