参考链接: #1. scikit-learn官网 /stable/modules/classes.html #2. scikit-learn中文手册/docs/master/30.html #3. 分类方法介绍https://www.cnblogs.com/qiuyuyu/p/11399697.html 如何选择分类分析算法:文本文类——朴素贝叶斯 1. Logistic 回归 (对数几率回归)Logistic Regression不光可以做二元分类,也可以解决多元分类问题。logistic 回归,虽然名字里有 “回归” 二字,但实际上是解决分类问题的一类线性模型。该模型利用函数 logistic function 将单次试验(single trial)的可能结果输出为概率。scikit-learn 中 logistic 回归在 LogisticRegression 类中实现了二分类(binary)、一对多分类(one-vs-rest)及多项式 logistic 回归,并带有可选的 L1 和 L2 正则化。
2. 线性和二次判别分析(LDA和QDA)线性判别分析(discriminant_analysis.LinearDiscriminantAnalysis)和二次判别分析(discriminant_analysis.QuadraticDiscriminantAnalysis)是两个经典的分类器。正如他们名字所描述的那样,他们分别代表了线性决策平面和二次决策平面。 # LinearDiscriminantAnalysis import numpy as np from sklearn.discriminant_analysis import LinearDiscriminantAnalysis X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) y = np.array([1, 1, 1, 2, 2, 2]) clf = LinearDiscriminantAnalysis() clf.fit(X, y) print(clf.predict([[-0.8, -1]]))
#LDA和QDA比对,LDA不同的类使用同一个标准判别,QDA不同的类使用不同的标准判别 from scipy import linalg import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl from matplotlib import colors
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
# ############################################################################# # Colormap cmap = colors.LinearSegmentedColormap( 'red_blue_classes', {'red': [(0, 1, 1), (1, 0.7, 0.7)], 'green': [(0, 0.7, 0.7), (1, 0.7, 0.7)], 'blue': [(0, 0.7, 0.7), (1, 1, 1)]}) plt.cm.register_cmap(cmap=cmap)
# ############################################################################# # Generate datasets def dataset_fixed_cov(): '''Generate 2 Gaussians samples with the same covariance matrix''' n, dim = 300, 2 np.random.seed(0) C = np.array([[0., -0.23], [0.83, .23]]) X = np.r_[np.dot(np.random.randn(n, dim), C), np.dot(np.random.randn(n, dim), C) + np.array([1, 1])] y = np.hstack((np.zeros(n), np.ones(n))) return X, y
def dataset_cov(): '''Generate 2 Gaussians samples with different covariance matrices''' n, dim = 300, 2 np.random.seed(0) C = np.array([[0., -1.], [2.5, .7]]) * 2. X = np.r_[np.dot(np.random.randn(n, dim), C), np.dot(np.random.randn(n, dim), C.T) + np.array([1, 4])] y = np.hstack((np.zeros(n), np.ones(n))) return X, y
# ############################################################################# # Plot functions def plot_data(lda, X, y, y_pred, fig_index): splot = plt.subplot(2, 2, fig_index) if fig_index == 1: plt.title('Linear Discriminant Analysis') plt.ylabel('Data with\n fixed covariance') elif fig_index == 2: plt.title('Quadratic Discriminant Analysis') elif fig_index == 3: plt.ylabel('Data with\n varying covariances')
tp = (y == y_pred) # True Positive tp0, tp1 = tp[y == 0], tp[y == 1] X0, X1 = X[y == 0], X[y == 1] X0_tp, X0_fp = X0[tp0], X0[~tp0] X1_tp, X1_fp = X1[tp1], X1[~tp1]
# class 0: dots plt.scatter(X0_tp[:, 0], X0_tp[:, 1], marker='.', color='red') plt.scatter(X0_fp[:, 0], X0_fp[:, 1], marker='x', s=20, color='#990000') # dark red
# class 1: dots plt.scatter(X1_tp[:, 0], X1_tp[:, 1], marker='.', color='blue') plt.scatter(X1_fp[:, 0], X1_fp[:, 1], marker='x', s=20, color='#000099') # dark blue
# class 0 and 1 : areas nx, ny = 200, 100 x_min, x_max = plt.xlim() y_min, y_max = plt.ylim() xx, yy = np.meshgrid(np.linspace(x_min, x_max, nx), np.linspace(y_min, y_max, ny)) Z = lda.predict_proba(np.c_[xx.ravel(), yy.ravel()]) Z = Z[:, 1].reshape(xx.shape) plt.pcolormesh(xx, yy, Z, cmap='red_blue_classes', norm=colors.Normalize(0., 1.), zorder=0) plt.contour(xx, yy, Z, [0.5], linewidths=2., colors='white')
# means plt.plot(lda.means_[0][0], lda.means_[0][1], '*', color='yellow', markersize=15, markeredgecolor='grey') plt.plot(lda.means_[1][0], lda.means_[1][1], '*', color='yellow', markersize=15, markeredgecolor='grey')
return splot
def plot_ellipse(splot, mean, cov, color): v, w = linalg.eigh(cov) u = w[0] / linalg.norm(w[0]) angle = np.arctan(u[1] / u[0]) angle = 180 * angle / np.pi # convert to degrees # filled Gaussian at 2 standard deviation ell = mpl.patches.Ellipse(mean, 2 * v[0] ** 0.5, 2 * v[1] ** 0.5, 180 + angle, facecolor=color, edgecolor='black', linewidth=2) ell.set_clip_box(splot.bbox) ell.set_alpha(0.2) splot.add_artist(ell) splot.set_xticks(()) splot.set_yticks(())
def plot_lda_cov(lda, splot): plot_ellipse(splot, lda.means_[0], lda.covariance_, 'red') plot_ellipse(splot, lda.means_[1], lda.covariance_, 'blue')
def plot_qda_cov(qda, splot): plot_ellipse(splot, qda.means_[0], qda.covariance_[0], 'red') plot_ellipse(splot, qda.means_[1], qda.covariance_[1], 'blue')
plt.figure(figsize=(10, 8), facecolor='white') plt.suptitle('Linear Discriminant Analysis vs Quadratic Discriminant Analysis', y=0.98, fontsize=15) for i, (X, y) in enumerate([dataset_fixed_cov(), dataset_cov()]): # Linear Discriminant Analysis lda = LinearDiscriminantAnalysis(solver='svd', store_covariance=True) y_pred = lda.fit(X, y).predict(X) splot = plot_data(lda, X, y, y_pred, fig_index=2 * i + 1) plot_lda_cov(lda, splot) plt.axis('tight')
# Quadratic Discriminant Analysis qda = QuadraticDiscriminantAnalysis(store_covariance=True) y_pred = qda.fit(X, y).predict(X) splot = plot_data(qda, X, y, y_pred, fig_index=2 * i + 2) plot_qda_cov(qda, splot) plt.axis('tight') # plt.tight_layout() # plt.subplots_adjust(top=0.92) # plt.show() . 贝叶斯分类我们可以使用最大后验概率(Maximum A Posteriori, MAP) 来估计 P(y) 和 P(x_i \mid y) ; 前者是训练集中类别 y 的相对频率。各种各样的的朴素贝叶斯分类器的差异大部分来自于处理 P(x_i \mid y) 分布时的所做的假设不同。GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法。特征的可能性(即概率)假设为高斯分布
4. 分类树¶决策树(Decision Tree)可分为分类树与回归树。分类树使用信息增益或信息增益比率来划分节点,每个节点样本的类别情况投票(voting)决定测试样本的类别。 decision tree
DecisionTreeClassifier 是能够在数据集上执行多分类的类,与其他分类器一样,DecisionTreeClassifier 采用输入两个数组:数组X,用 [n_samples, n_features] 的方式来存放训练样本。整数值数组Y,用 [n_samples] 来保存训练样本的类标签。DecisionTreeClassifier 既能用于二分类(其中标签为[-1,1])也能用于多分类(其中标签为[0,…,k-1])。 import numpy as np from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn import tree
iris = load_iris() X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
clf = DecisionTreeClassifier(max_leaf_nodes=3, random_state=0) clf.fit(X_train, y_train) data=clf.predict(X_test) print(data) 5. 支持向量机 (Support Vector Machine)(SVC, NuSVC 和 LinearSVC 能在数据集中实现多元分类.)SVM可通过升维来解决在低维中线性不可分的问题,旨在找到一个超平面(Hyperlane)作为线性决策边界(decision boundry),最大化分类边界,将特征空间中的数据更好的分隔开。SVM有着优秀的泛化能力,但更适用于小样本训练,因为svm对于内存消耗很大。若数据量很大,训练时间会较长。且SVM在小样本上能够得到比其他算法好很多的结果。 SVC 和 NuSVC 是相似的方法, 但是接受稍许不同的参数设置并且有不同的数学方程(在这部分看 数学公式). 另一方面, LinearSVC 是另一个实现线性核函数的支持向量分类. 记住 LinearSVC 不接受关键词 kernel, 因为它被假设为线性的. 它也缺少一些 SVC 和 NuSVC 的成员(members) 比如 support_ . 支持向量机 (SVMs) 可用于以下监督学习算法: 分类, 回归 和 异常检测. 支持向量机的优势在于:
支持向量机的缺点包括: 如果特征数量比样本数量大得多,在选择核函数 核函数 时要避免过拟合, 而且正则化项是非常重要的.
# nusvc import numpy as np X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) y = np.array([1, 1, 2, 2]) from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler from sklearn.svm import NuSVC clf = make_pipeline(StandardScaler(), NuSVC()) clf.fit(X, y) # Pipeline(steps=[('standardscaler', StandardScaler()), ('nusvc', NuSVC())]) print(clf.predict([[-0.8, -1]]))
6. KNN(K-Nearest Negihbour)K近邻是基于实例的分类(instance-based learning) ,属于惰性学习 (lazy learning) 。比如在现实中,预测某一个房子的价格,就参考最相似的K个房子的价格,比如距离最近、户型最相似等等。KNN没有明显的训练学习过程,不同K值的选择都会对KNN算法的结果造成重大影响。如下图所示,k=1与k=3预测的类别是不同的。 sklearn.neighbors 提供了 neighbors-based (基于邻居的) 无监督学习以及监督学习方法的功能。无监督的最近邻是许多其它学习方法的基础,尤其是 manifold learning (流形学习) 和 spectral clustering (谱聚类)。neighbors-based (基于邻居的) 监督学习分为两种:classification (分类)针对的是具有离散标签的数据,regression (回归)针对的是具有连续标签的数据。 最近邻方法背后的原理是从训练样本中找到与新点在距离上最近的预定数量的几个点,然后从这些点中预测标签。这些点的数量可以是用户自定义的常量(K-最近邻学习), 也可以根据不同的点的局部密度(基于半径的最近邻学习)确定。距离通常可以通过任何度量来衡量:standard Euclidean distance(标准欧式距离)是最常见的选择。Neighbors-based(基于邻居的)方法被称为 非泛化 机器学习方法, 因为它们只是简单地”记住”了其所有的训练数据(可能转换为一个快速索引结构,如 Ball Tree 或 KD Tree)。 尽管它简单,但最近邻算法已经成功地适用于很多的分类和回归问题,例如手写数字或卫星图像的场景。作为一个 non-parametric(非参数化)方法,它经常成功地应用于决策边界非常不规则的分类情景下。 X = [[0], [1], [2], [3]] y = [0, 0, 1, 1] from sklearn.neighbors import KNeighborsClassifier neigh = KNeighborsClassifier(n_neighbors=3) neigh.fit(X, y) print(neigh.predict([[1.1]])) print(neigh.predict_proba([[0.9]])) 7. 集成学习(Ensembale Learning)常见的集成算法:bagging、boosting、stacking
# GBDT # Gradient Tree Boosting 或梯度提升回归树(GBRT)是对于任意的可微损失函数的提升算法的泛化。GBRT 是一个准确高效的现有程序, 它既能用于分类问题也可以用于回归问题。梯度树提升模型被应用到各种领域,包括网页搜索排名和生态领域。 from sklearn.datasets import make_hastie_10_2 from sklearn.ensemble import GradientBoostingClassifier
X, y = make_hastie_10_2(random_state=0) X_train, X_test = X[:2000], X[2000:] y_train, y_test = y[:2000], y[2000:]
clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0).fit(X_train, y_train) clf.score(X_test, y_test)
#Adaboost 梯度提升树 from sklearn.ensemble import AdaBoostClassifier from sklearn.datasets import make_classification X, y = make_classification(n_samples=1000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False) clf = AdaBoostClassifier(n_estimators=100, random_state=0) clf.fit(X, y)
clf.predict([[0, 0, 0, 0]])
clf.score(X, y)
8.高斯过程分类 GPC高斯过程 (GP) 是一种常用的监督学习方法,旨在解决回归问题和概率分类问题。 高斯过程模型的优点如下: 预测内插了观察结果(至少对于正则核)。预测结果是概率形式的(高斯形式的)。这样的话,人们可以计算得到经验置信区间并且据此来判断是否需要修改(在线拟合,自适应)在一些区域的预测值。通用性: 可以指定不同的:内核(kernels)。虽然该函数提供了常用的内核,但是也可以指定自定义内核。 高斯过程模型的缺点包括: 它们不稀疏,例如,模型通常使用整个样本/特征信息来进行预测。高维空间模型会失效,高维也就是指特征的数量超过几十个。 from sklearn.datasets import load_iris from sklearn.gaussian_process import GaussianProcessClassifier from sklearn.gaussian_process.kernels import RBF X, y = load_iris(return_X_y=True) kernel = 1.0 * RBF(1.0) gpc = GaussianProcessClassifier(kernel=kernel, random_state=0).fit(X, y) gpc.score(X, y)
data=gpc.predict_proba(X[:2,:]) print(data) 9.神经网络分类多层感知器(MLP) 是一种监督学习算法,通过在数据集上训练来学习函数 f(\cdot): R^m \rightarrow R^o,其中 m 是输入的维数,o 是输出的维数。给定一组特征 X = {x_1, x_2, ..., x_m} 和标签 y ,它可以学习用于分类或回归的非线性函数。与逻辑回归不同的是,在输入层和输出层之间,可以有一个或多个非线性层,称为隐藏层。图1 展示了一个具有标量输出的单隐藏层 MLP。 此实现不适用于大规模数据应用。特别是 scikit-learn 不支持 GPU。如果想要提高运行速度并使用基于 GPU 的实现以及为构建深度学习架构提供更多灵活性的框架,
10.随机梯度下降(SGD)分类¶随机梯度下降(SGD) 是一种简单但又非常高效的方法,主要用于凸损失函数下线性分类器的判别式学习,例如(线性) 支持向量机 和 Logistic 回归 。尽管 SGD 在机器学习社区已经存在了很长时间, 但是最近在 large-scale learning (大规模学习)方面 SGD 获得了相当大的关注。 SGD 已成功应用于在文本分类和自然语言处理中经常遇到的大规模和稀疏的机器学习问题。对于稀疏数据,本模块的分类器可以轻易的处理超过 10^5 的训练样本和超过 10^5 的特征。 Stochastic Gradient Descent (随机梯度下降法)的优势: 高效。 Stochastic Gradient Descent (随机梯度下降法)的劣势:
import numpy as np from sklearn.linear_model import SGDClassifier from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) Y = np.array([1, 1, 2, 2]) # Always scale the input. The most convenient way is to use a pipeline. clf = make_pipeline(StandardScaler(), SGDClassifier(max_iter=1000, tol=1e-3)) clf.fit(X, Y)
print(clf.predict([[-0.8, -1]])) 多种分类器比较
|
|
来自: NeighborMrSun > 《机器学习模型》