一、常见算法分类
- 分类方法
- KNN
- 逻辑斯蒂回归(logiscic)
- 决策树
- 朴素贝叶斯
- 支持向量机SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
- 回归方法
- KNN
- 普通线性回归(linear)
- 岭回归(ridge)
- lasso回归
- 决策树
- 支持向量机SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
- 聚类方法
- K均值算法(K-means) (无监督学习)
from sklearn.cluster import KMeans
二、算法说明
1.KNN算法
kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。
该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。
- 优点
简单,易于理解,易于实现,无需估计参数,无需训练
适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型)
特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好
- 缺点
懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢
可解释性较差,无法给出决策树那样的规则。
更多KNN算法理解
- 使用
#1.导入:
分类问题:
from sklearn.neighbors import KNeighborsClassifier
回归问题:
from sklearn.neighbors import KNeighborsRegressor#2.创建模型
knnclf = KNeighborsClassifier(n_neighbors=5)
knnrgr = KNeighborsRegressor(n_neighbors=3)#3.训练
knnclf.fit(X_train,y_train)#4.预测
y_pre = knnclf.predict(x_test)
- 练习案例
- 分类:处理鸢尾花数据、人类动作识别、预测年收入、手写数字识别
- 回归:人脸补全
2.普通线性回归:linear
线性回归由两个词组成的:线性和回归。线性用来描述变量X(variable 或predictor或feature)的系数与响应Y(response)之间的关系是线性的。回归说明它的响应是定量(quantitative)的,而不是定性(qualitative)的。
- 使用
#1.导入
from sklearn.linear_model import LinearRegression
#2.创建模型
line = LinearRegression()
#3.训练
line.fit(X_train,y_train)
#4.预测
y_pre= line.predict(x_test)
- 案例:
- 波士顿房价预测
- 预测鲍鱼年龄
- 人脸补全
3.岭回归:ridge
- 定义
岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
岭回归是加了二阶正则项的最小二乘,主要适用于过拟合严重或各变量之间存在多重共线性的时候,岭回归是有bias的,这里的bias是为了让variance更小
归纳总结
1.岭回归可以解决特征数量比样本量多的问题
2.岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维的效果
3.缩减算法可以看作是对一个模型增加偏差的同时减少方差
岭回归用于处理下面两类问题:
1.数据点少于变量个数
2.变量间存在共线性(最小二乘回归得到的系数不稳定,方差很大)
- 使用
#1.导入
from sklearn.linear_model import Ridge
#2.创建模型
# alpha就是缩减系数lambda
# 如果把alpha设置为0,就是普通线性回归
ridge = Ridge(alpha=0)
#3.训练
#4.预测
4.lasso回归
说明
该方法是一种压缩估计。它通过构造一个罚函数得到一个较为精炼的模型,使得它压缩一些系数,同时设定一些系数为零。因此保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。
使用
#1.导入
from sklearn.linear_model import Lasso
#2.创建模型
las = Lasso(alpha=0.0001)
#3.训练
#4.预测
- 案例
- 波士顿房价预测
- 预测鲍鱼年龄
- 人脸补全
5.逻辑斯蒂回归:logistic
- 说明
利用Logistics回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。
训练分类器时的做法就是寻找最佳拟合参数,使用的是最优化算法。接下来介绍这个二值型输出分类器的数学原理
Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:
(1)找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。这个过程是非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。
(2)构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。
(3)显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。找函数的最小值有不同的方法,Logistic Regression实现时有梯度下降法(Gradient Descent)。
- 使用
#1.导入
from sklearn.linear_model import LogisticRegression#2.创建模型
logistic = LogisticRegression(solver='lbfgs')#solver参数的选择:
“liblinear”:小数量级的数据集
“lbfgs”, “sag” or “newton-cg”:大数量级的数据集以及多分类问题
“sag”:极大的数据集#3.训练#4.预测
案例
- 手写数字集分类
- make_blobs聚类数据进行分类
- 预测年收入是否大于50K美元
- 从疝气病症预测病马的死亡率
6.决策树
说明
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
分类解决离散问题,回归解决连续问题
#1.导入
分类:from sklearn.tree import DecisionTreeClassifier
回归:from sklearn.tree import DecisionTreeRegressor
#2.创建模型
# max_depth 整数类型,决定对多少个数据特征做分裂
tree = DecisionTreeClassifier(max_depth=5)
tree = DecisionTreeRegressor(max_depth=5)
#3.训练
#4.预测
案例
- 处理鸢尾花数据
- 预测隐形眼镜类型
- 处理make_blobs聚类数据
7.朴素贝叶斯
优点:
- 朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率;
- 对小规模的数据表现很好;
- 能处理多分类任务,适合增量式训练;
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类
缺点:
- 只能用于分类问题
- 需要计算先验概率;
- 分类决策存在错误率;
- 对输入数据的表达形式很敏感
1、高斯分布朴素贝叶斯
应用场景
- 高斯分布就是正态分布
- 用于一般分类问题
使用
#1.导入
from sklearn.naive_bayes import GaussianNB
#2.创建模型
gNB = GaussianNB()
#3.训练
gNB.fit(data,target)
#4.预测
y_pre = gNB.predict(x_test)
2、多项式分布朴素贝叶斯
应用场景
- 适用于文本数据(特征表示的是次数,例如某个词语的出现次数)
使用
#1.导入
from sklearn.naive_bayes import MultinomialNB#2.创建模型
mNB = MultinomialNB()#3.字符集转换为词频
from sklearn.feature_extraction.text import TfidfVectorizer
#先构建TfidfVectorizer对象
tf = TfidfVectorizer()
#使用要转换的数据集和标签集对tf对象进行训练
tf.fit(X_train,y_train)
#文本集 ----> 词频集
X_train_tf = tf.transform(X_train)#4.使用词频集对机器学习模型进行训练
mNB.fit(X_train_tf,y_train)#5.预测#将字符集转化为词频集
x_test = tf.transform(test_str)
#预测
mNB.predict(x_test)
- 案例:垃圾短信过滤
3、伯努利分布朴素贝叶斯
应用场景
- 适用于伯努利分布,也适用于文本数据(此时特征表示的是是否出现,例如某个词语的出现为1,不出现为0)
- 绝大多数情况下表现不如多项式分布,但有的时候伯努利分布表现得要比多项式分布要好,尤其是对于小数量级的文本数据
使用
#1.导入
from sklearn.naive_bayes import BernoulliNB#2.创建模型
bNB = BernoulliNB()#3.将字符集转词频集
from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer()
tf.fit(X_train,y_train)
X_train_tf = tf.transform(X_train)#4.训练
bNB.fit(X_train_tf,y_train)#5.预测
#将字符集转化为词频集
x_test = tf.transform(test_str)
#预测
bNB.predict(x_test)
- 案例
- 高斯分布:普通分类(鸢尾花)
- 多项式分布、伯努利分布:文本处理(垃圾短信、垃圾邮件过滤)
8.支持向量机SVM
- 原理
解决的问题:
1.线性分类
在训练数据中,每个数据都有n个的属性和一个二类类别标志,我们可以认为这些数据在一个n维空间里。我们的目标是找到一个n-1维的超平面(hyperplane),这个超平面可以将数据分成两部分,每部分数据都属于同一个类别。 其实这样的超平面有很多,我们要找到一个最佳的。因此,增加一个约束条件:这个超平面到每边最近数据点的距离是最大的。也成为最大间隔超平面(maximum-margin hyperplane)。这个分类器也成为最大间隔分类器(maximum-margin classifier)。 支持向量机是一个二类分类器。
2.非线性分类
SVM的一个优势是支持非线性分类。它结合使用拉格朗日乘子法和KKT条件,以及核函数可以产生非线性分类器。
SVM的目的是要找到一个线性分类的最佳超平面 f(x)=xw+b=0。求 w 和 b。首先通过两个分类的最近点,找到f(x)的约束条件。
有了约束条件,就可以通过拉格朗日乘子法和KKT条件来求解,这时,问题变成了求拉格朗日乘子αi 和 b。
对于异常点的情况,加入松弛变量ξ来处理。
非线性分类的问题:映射到高维度、使用核函数。线性分类及其约束条件:
SVM的解决问题的思路是找到离超平面的最近点,通过其约束条件求出最优解。
- 使用
#1.导入
处理分类问题:
from sklearn.svm import SVC
处理回归问题:
from sklearn.svm import SVR
#2.创建模型(回归时使用SVR)
svc = SVC(kernel='linear')
svc = SVC(kernel='rbf')
svc = SVC(kernel='poly')
#3.训练
svc_linear.fit(X_train,y_train)
svc_rbf.fit(X_train,y_train)
svc_poly.fit(X_train,y_train)
#4.预测
linear_y_ = svc_linear.predict(x_test)
rbf_y_ = svc_rbf.predict(x_test)
poly_y_ = svc_poly.predict(x_test)
9.K均值算法(K-means)
原理
- 聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中。
- K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。
使用
#1.导入
from sklearn.cluster import KMeans#2.创建模型
# 构建机器学习对象kemans,指定要分类的个数
kmean = KMeans(n_clusters=2)#3.训练数据
# 注意:聚类算法是没有y_train的
kmean.fit(X_train)#4.预测数据
y_pre = kmean.predict(X_train)
- 实例
- 中国足球定位
- 图片压缩