分类回归的区别
https://www.zhihu.com/question/21329754/answer/18004852
什么是数值型和标称型
- 标称型: 一般在有限的数据中取,而且只存在‘是’和‘否’两种不同的结果(一般用于分类)
- 数值型: 可以在无限的数据中取,而且数值比较具体化,例如4.02,6.23这种值(一般用于回归分析)
kNN k-邻近算法
实现过程
计算已知类别数据集中的点与当前待分类点之间的距离
按照距离递增次序排序
选取与当前点距离最小的k个点
确定前k个点所在类别的出现概率
返回前k个点出现概率最高的类别作为当前点的预测分类
KNN sklearn实现
http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
iris = load_iris() clf = neighbors.KNeighborsClassifier(n_neighbors=3) X = iris.data y = iris.target knn = clf.fit(X, y) predict = knn.predict([[4.1, 3.3, 1.4, 0.3]])
关键参数:
- n_neighbors 设置K个的个数
决策树
实现过程
特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。
决策树生成: 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。 树结构来说,递归结构是最容易理解的方式。
剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。
信息增益和熵的概念
决策树 sklearn实现
http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
clf = tree.DecisionTreeClassifier() clf = clf.fit(iris.data, iris.target) with open("iris.dot", 'w') as f: f = tree.export_graphviz(clf, out_file=f)
关键参数
参考链接:
朴素贝叶斯
实际应用
在实际应用中,我们的现象不可能只有一个,比如,在垃圾邮件分类中,甚至可能有几千个词的特征向量。下面,我将引入一些数学上的记号来统一后面的表达:
ωj表示属于哪个类别,j∈{1,2,3,…,m}
xi表示特征向量中的第i个特征,i∈{1,2,3,…,n}
朴素贝叶斯的目标就是分别求得P(ωj|给定现象)j∈{1,2,3,…,m},选出最大的概率。
朴素贝叶斯 sklearn实现
http://sklearn.lzjqsdd.com/modules/naive_bayes.html
iris = datasets.load_iris() from sklearn.naive_bayes import GaussianNB nb = GaussianNB() y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
参考链接:
Logistic回归
logistic sklearn实现
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
import numpy as np from sklearn import linear_model, datasets from sklearn.cross_validation import train_test_split # 1.加载数据 iris = datasets.load_iris() X = iris.data[:, :2] # 使用前两个特征 Y = iris.target #np.unique(Y) # out: array([0, 1, 2]) # 2.拆分测试集、训练集。 X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0) # 设置随机数种子,以便比较结果。 # 3.标准化特征值 from sklearn.preprocessing import StandardScaler sc = StandardScaler() sc.fit(X_train) X_train_std = sc.transform(X_train) X_test_std = sc.transform(X_test) # 4. 训练逻辑回归模型 logreg = linear_model.LogisticRegression(C=1e5) logreg.fit(X_train, Y_train) # 5. 预测 prepro = logreg.predict_proba(X_test_std) acc = logreg.score(X_test_std,Y_test)
关键参数:
参考链接:
Logistic回归(Logistic Regression)算法笔记
svm算法
实现过程
- 寻找最大分类间距
- 转而通过拉格朗日函数求优化的问题
- 数据可以通过画一条直线就可以将它们完全分开,这组数据叫线性可分(linearly separable)数据,而这条分隔直线称为分隔超平面(separating hyperplane)
svm sklearn实现
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
from sklearn import datasets from sklearn.cross_validation import train_test_split from sklearn.svm import SVC from numpy import * # download the dataset iris_dataset = datasets.load_iris() iris_data = iris_dataset.data iris_target = iris_dataset.target # split data and target into training set and testing set # 80% training, 20% testing x_train, x_test, y_train, y_test = train_test_split(iris_data, iris_target, test_size = 0.2) # construct SVC by using rbf as kernel function SVC_0 = SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr') SVC_0.fit(x_train, y_train) predict = SVC_0.predict(x_test) right = sum(predict == y_test) # accuracy rate print("%f%%" % (right * 100.0 / predict.shape[0]))
关键参数
- SVM模型有两个非常重要的参数C与gamma。其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
- gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
参考链接
集成方法
- 投票选举(bagging: 自举汇聚法 bootstrap aggregating): 是基于数据随机重抽样分类器构造的方法
- 再学习(boosting): 是基于所有分类器的加权求和的方法
目前 bagging 方法最流行的版本是: 随机森林(random forest)
目前 boosting 方法最流行的版本是: AdaBoost
随机森林原理
那随机森林具体如何构建呢?
有两个方面:
- 数据的随机性化
- 待选特征的随机化
RF sklearn实现
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
from sklearn.ensemble import RandomForestClassifier 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 = RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=2, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False, random_state=0, verbose=0, warm_start=False) clf.fit(X, y) print(clf.feature_importances_) print(clf.predict([[0, 0, 0, 0]]))
关键参数
- n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100
- oob_score :即是否采用袋外样本来评估模型的好坏。默认识False。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力
- criterion: 即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。
参考链接
AdaBoost 原理
Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
adaboost sklearn实现
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html
from sklearn.cross_validation import cross_val_score from sklearn.datasets import load_iris from sklearn.ensemble import AdaBoostClassifier iris = load_iris() clf = AdaBoostClassifier(n_estimators=100) scores = cross_val_score(clf, iris.data, iris.target) print scores.mean()
关键参数