机器学习笔记(持续更新)

分类回归的区别

https://www.zhihu.com/question/21329754/answer/18004852

什么是数值型和标称型

  • 标称型: 一般在有限的数据中取,而且只存在‘是’和‘否’两种不同的结果(一般用于分类)
  • 数值型: 可以在无限的数据中取,而且数值比较具体化,例如4.02,6.23这种值(一般用于回归分析)

kNN k-邻近算法

优点:精度高,对异常值不敏感,无数据输入假定

缺点:计算复杂度高,空间复杂度高

适用数据范围:数值型和标称型

实现过程

  1. 计算已知类别数据集中的点与当前待分类点之间的距离

  2. 按照距离递增次序排序

  3. 选取与当前点距离最小的k个点

  4. 确定前k个点所在类别的出现概率

  5. 返回前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]])

关键参数:

  1. n_neighbors 设置K个的个数

决策树

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据

缺点:可能会产生过度匹配问题

适用数据类型:数值型和标称型

实现过程

  1. 特征选择:特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。

  2. 决策树生成: 根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。 树结构来说,递归结构是最容易理解的方式。

  3. 剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。

信息增益和熵的概念

信息增益:熵 - 条件熵

条件熵 H(Y|X=长相)= p(X =帅)*H(Y|X=帅)+ p(X =不帅)*H(Y|X=不帅)

决策树 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)

关键参数

  1. 参考:DecisionTreeClassifier 调参

参考链接:

信息增益

条件熵

朴素贝叶斯

优点:对数据较少情况下仍然有效,可以处理多类别问题

缺点:对于输入数据的准备方式较为敏感

实际应用

在实际应用中,我们的现象不可能只有一个,比如,在垃圾邮件分类中,甚至可能有几千个词的特征向量。下面,我将引入一些数学上的记号来统一后面的表达:

ω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)

参考链接:

条件概率

机器学习实战1:朴素贝叶斯模型:文本分类+垃圾邮件分类

用朴素贝叶斯进行文本分类

带你搞懂朴素贝叶斯分类算法

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)

关键参数:

  1. scikit-learn 逻辑回归类库使用小结

  2. LogisticRegression类的各项参数的含义

参考链接:

机器学习中的目标函数、损失函数、代价函数有什么区别

Logistic回归(Logistic Regression)算法笔记

svm算法

优点:泛化错误率低,计算开销不大,结果易解释。

缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。

适用数据类型:数值型和标称型数据

实现过程

  1. 寻找最大分类间距
  2. 转而通过拉格朗日函数求优化的问题
  3. 数据可以通过画一条直线就可以将它们完全分开,这组数据叫线性可分(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]))

关键参数

  1. SVM模型有两个非常重要的参数C与gamma。其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
  2. gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。

参考链接

SVM理解与参数选择(kernel和C) 

scikit-learn 支持向量机算法库使用小结 

支持向量机高斯核调参小结

集成方法

  1. 投票选举(bagging: 自举汇聚法 bootstrap aggregating): 是基于数据随机重抽样分类器构造的方法
  2. 再学习(boosting): 是基于所有分类器的加权求和的方法

目前 bagging 方法最流行的版本是: 随机森林(random forest)

选男友:美女选择择偶对象的时候,会问几个闺蜜的建议,最后选择一个综合得分最高的一个作为男朋友

目前 boosting 方法最流行的版本是: AdaBoost

追女友:3个帅哥追同一个美女,第1个帅哥失败->(传授经验:姓名、家庭情况) 第2个帅哥失败->(传授经验:兴趣爱好、性格特点) 第3个帅哥成功

随机森林原理

那随机森林具体如何构建呢?

有两个方面:

  1. 数据的随机性化
  2. 待选特征的随机化

优点:几乎不需要输入准备、可实现隐式特征选择、训练速度非常快、其他模型很难超越、很难建立一个糟糕的随机森林模型、大量优秀、免费以及开源的实现。

缺点:劣势在于模型大小、是个很难去解释的黑盒子。

适用数据范围:数值型和标称型

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]]))

关键参数

  1. n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100
  2. oob_score :即是否采用袋外样本来评估模型的好坏。默认识False。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力
  3. criterion: 即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。

参考链接

scikit-learn 梯度提升树(GBDT)调参小结

scikit-learn随机森林调参小结

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()  

关键参数

scikit-learn Adaboost类库使用小结

posted @ 2018-12-18 10:13  he1m4n6a  阅读(521)  评论(0编辑  收藏