手把手教会机器学习(四)——分类

Python机器学习(四)——分类

Python机器学习(一)——特征工程
Python机器学习(二)——数据可视化
Python机器学习(三)——回归
在上一节的内容中,我们讨论了回归的问题,但只有回归并不能解决所有的预测问题,当我们要去在已有给定结果中去预测,我们就要用到分类的方法。分类的方法也有许多,我们将经行介绍。

1. 线性分类

线性分类指的是分类的决策界限为线性,通过将所有特征预期的经行加权后的划分评估。一般只有正负两个类别的离散类别。
其过程就是将输入进行加权后比对标准分类,这里便不在列举代码。

2.逻辑回归

逻辑回归是一种分类方式,虽然名字上是含有回归字样。它是依靠于Sigmoid函数(逻辑函数)经行分类的经行。Sigmoid函数十分具有特点,使用Python做出其图像,但在这之前我们要知道它的函数表达式
在这里插入图片描述
在这里插入图片描述从图像中我们可以清晰的发现由于这个函数极具的对称性,所以我们是可以采用他来经行分类。而这里我是将线性回归的假设函数式子代入Sigmoid函数,得到的就是逻辑回归函数(逻辑函数应用到线性回归模型,也许就是其名为逻辑回归的原因),我们可以看到逻辑函数的值域是在零到一间取值,而当它适用于二分类时,其可以被看作是预测的分类概率。
在这里插入图片描述当θ的转置与x的积值大于零时作为正例,小于零时为负例。这个就是我们上一章提到的线性回归模型,而这个Sigmoid内部的线性回归模型就是该逻辑分类的决策边界,在决策边界以上或以外的点代入到其内部时会使内部乘积大于零,故为正例,反之,同理可推。由上一章回归的内容可知,这个决策边界可能是直线也可能是曲线。列如下图:
在这里插入图片描述
在这里插入图片描述
既然,其内部作为线性回归,我们依旧需要依托于原来的方法来求解这里的θ,所以我们要先探讨一下有关逻辑回归的代价函数

逻辑函数的代价函数

在推导cost函数之前,我们先要得到loss(损失)函数:
在这里插入图片描述
逻辑回归的loss函数需要利用到极大似然法经行证明:
我们令y=1的概率为P
则y=0的概率为1-p
我们可以将概率计算合并到一起,就为:
在这里插入图片描述
求所有的训练集的总概率,我们需要将其全部相乘:
在这里插入图片描述这就是我们的似然函数我对其经行经行取对数就可以得到:
在这里插入图片描述

这里之所以加个负号是因为我们得到的式子是一个上升的,而我们要用到梯度下降,所以将它反转过来,而我们看内部的式子就是我们一开始提到的loss分段函数的合并式。得到了loss函数,继而我们可以采用同样的方式推导cost函数:
在这里插入图片描述然后,在经行梯度下降算法,与上一章的操作一致。

代码实现

这里我们以最常用的kaggle中Titanic的例子来示范代码
先调用库:这里我们要多引用几个库,StandardScaler用以标准化(使用Z-Score),confusion matrix 混淆矩阵与分类评估分数用以评估模型。

from sklearn.linear_model import LogisticRegression
import pandas
import numpy
import seaborn
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import preprocessing
from sklearn.metrics import confusion_matrix, classification_report,accuracy_score

数据预处理:读入数据,列举数据及特征,数据可视化,检查空值,空缺值处理,分离因变量、自变量,划分训练集、测试集···

#读入数据
titanic_data = pandas.read_csv('tested.csv')
#列举数据及特征(特征工程)
titanic_data.head()
#选定特征(部分无关特征抛弃)
titanic_data = titanic_data[['Survived','Pclass','Sex','Age','SibSp','Parch','Embarked','Fare']]
#检测数据的形状
titanic_data.shape
#数据可视化,可以清晰观察幸存者的数量
titanic_data['Survived'].value_counts()
seaborn.countplot(x='Survived',data=titanic_data)
#对数据经行预处理(查询缺省,并对缺省经行处理)
#实际我们发现Age与Fare均有缺省
#使用均值替代Age缺省,Fare缺省直接丢弃
titanic_data.isnull().any()
titanic_data['Age'].fillna((titanic_data['Age'].mean()),inplace=True)
titanic_data.dropna(inplace=True)
#分离变量
x_data=titanic_data[['Pclass','Sex','Age','SibSp','Parch','Embarked','Fare']]
y_data=titanic_data[['Survived']]
#划分数据集
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size = 0.20)
#为了减小算力消耗,这里使用Z-Score处理数据
#这里改变了数据,Jupyter会有一个warning,不用管它
age_standard=StandardScaler()
age_standard.fit(pandas.DataFrame(x_train['Age']))
x_train[['Age']]=age_standard.transform(x_train[['Age']])
fare_standard=StandardScaler()
fare_standard.fit(pandas.DataFrame(x_train['Fare']))
x_train[['Fare']]=age_standard.transform(x_train[['Fare']])
embarked_encoder = preprocessing.LabelEncoder()
embarked_encoder.fit(pandas.DataFrame(x_train['Embarked']))
x_train[['Embarked']]=embarked_encoder.transform(x_train[['Embarked']])
#我们要把性别的'female'&‘male’改为‘0/1’
x_train['Sex']=x_train['Sex'].map({'female': 0,'male': 1})
#再检测特征转换形式是否正确
seaborn.heatmap(x_train.corr())
#我发现此图(图一)成明显对称趋势
#说明Pclass与Fare存在较高相关性故删除Pclass
del x_train['Pclass']

在这里插入图片描述 (图一)

模型搭建:数据导入、创建算法对象、拟合分类

#将数据导入
x_train = x_train.values
y_train = y_train.values
#创建logistic regression对象
logistic_regression = LogisticRegression()
#拟合分类
logistic_regression.fit(x_train,y_train)

模型测试:分类报告、最缺率、混淆矩阵
混淆矩阵就长这样(借用百科)
在这里插入图片描述可以用来囊括数据,并分析模型分类表现。(wait)我好像找到了学校老师的PPT😁
在这里插入图片描述在这里插入图片描述

#测试集数据也要先用Z-Score标准化,及删去Pclass
x_test['Sex']=x_test['Sex'].map({'female': 0,'male': 1})
x_test[['Age']]=age_standard.transform(x_test[['Age']])
x_test[['Fare']]=fare_standard.transform(x_test[['Fare']])
x_test[['Embarked']]=embarked_encoder.transform(x_test[['Embarked']])
del x_test['Pclass']
#数据导入
x_test = x_test.values
y_test = y_test.values
#预测测试集,并得到预测值y_prediction
y_prediction = logistic_regression.predict(x_test)
#混淆矩阵
confusion_matrix(y_test,y_prediction) 
#输出分类报告
print(classification_report, y_prediction)
#输出accuracy
print(accuracy_score(y_test,y_prediction))

以上便是一个简单的模型,当然如果你想得到更加优化的模型,你可以访问kaggle社区,你会得到更多人的帮助。另外有关逻辑回归函数也可以称之为“对数几率回归”,起初是在西瓜书中看到相关翻译的探讨,继而我查找Wiki百科也发现起因问名称可被称为“logistic regression”和“logit regression”

3.决策树

决策树是一种利用特征数据的离散进行预测的树状决策支持工具,其广泛运用于运筹学,同样也是机器学习中重要的算法之一,是后续的随机森林等算法的基础。决策树实际上是用离散特征对对预测对象经行的层层判定(决策),进而归为具有共同特定属性的一类,而在这层层决策的期间利用了“分治”的算法思想,从而形成了这颗决策树。决策树有被分为:分类树与回归树,本文指得是回归树,而回归树的目标变量数据要求的就是连续值。
(以下就是一个关于Titanicd的决策树例子,作者: Gilgoldm)
在这里插入图片描述我们可以发现这一算法的核心在于如何对分支节点经行选择,分支节点上划分属性的排序及选择,我们是希望其数据更为有益于我们的分类。我们就要排除噪声对所得到的数据的信息价值经行评估。这里就要引用到香农提出的“信息熵”。
概率是宏观态中微观态的确定性;熵是宏观态中微观态的不确定性。对于信息而言,不确定性的可能情况是2的参照事件数量的幂。所以,要求是多少个参照事件产生的这些不确定情况,我们就要对参照事件取2的对数(类比:8种硬币的抛取情况,是由3个硬币产生)。但这样就要求这些情况是等概率的,而对于不等概率情况,我们要分别对这些参照事件乘上他们的发生概率再相加。由恒定概率事件的概率倒数是等于概率事件出现的期望值,我们可以直接对参照事件发生事件的概率的倒数取对数,再与概率相乘,最后对各类样本事例求和,即是“信息熵”(information entropy)

在这里插入图片描述D: 样本集合
pi: 样本集合D种第i类样本所占的比例pi
在样本中含有一定数量的决策特征,我们要考虑到这些特征所包含的数据数量不同,我们便分配其相应的权重(Di/D),特征所对应的样本数越多,其所占权重也越大,对预测产生的影响也越大,然后我们用总熵减去该离散属性加权后的熵之和就是“信息增益”
在这里插入图片描述
a:离散属性{a1,a2,···,am}
该值越大,说明该属性与样本更可能属于同一类型。所以我们可以用信息增益来选择划分属性,即我们根据样本计算各个特征的信息增益,选择信息增益值高者作为划分属性,再对该属性所包含的不同参数(决策判断的各种情况)分别进行其他特征的信息增益求值,以确定下一节点的划分属性。
而在部分决策树(CART)中采用基尼值来度量数据纯度,基尼指数选择决策属性。
基尼值:
在这里插入图片描述既然,基尼值可以同信息增益一样衡量数据的纯度,所以得到了基尼值,推导基尼指数过程同上一样。
基尼指数:
在这里插入图片描述唯一有所区别的是信息增益其值越大,其划分依据才越合理,所以我们要做的是在待选特征中最大化信息增益值;而基尼值正好相反,我们要做的就是将最小化基尼指数的值作为最优划分属性。

代码实现

在之前介绍决策树的时候,引用了一张图,做的是titanic的决策树,正好之前我们的逻辑回归也是用的这个数据,所以我们的决策树模型也将使用这个模型。

#建立模型对象
decision_tree = tree.DecisionTreeClassifier()
#模型训练
decision_tree.fit(x_train,y_train)
#绘制决策树
featurename = ['Sex','Age','SibSp','Parch','Embarked','Fare']
import pydotplus 
from IPython.display import Image

dot_data = tree.export_graphviz(decision_tree, feature_names=featurename, class_names=['death(0)','survive(1)'], filled=True, 
                                out_file=None) 
graph = pydotplus.graph_from_dot_data(dot_data) 
Image(graph.create_png())
#测试集预测
y_pred = decision_tree.predict(x_test)
#模型测试,和逻辑回归同。

4.随机森林

随机森林的基础是决策树,是决策树通过集成学习思想进行的拓展算法。顾名思义就是对不同的样本数据经行构造决策树,在通过这些决策树预测结果经行多数表决。

在这里插入图片描述

代码实现

其实可以代码部分是趋于格式化的

#建立模型对象
random_forest = RandomForestClassifier()
#模型训练
random_forest.fit(x_train,y_train)
#测试集预测
y_randomforest_prediction = random_forest.predict(x_test)
#模型测试,和逻辑回归同。

5.朴素贝叶斯

贝叶斯公式是:

在这里插入图片描述
根据条件概率(P(x|y)=P(xy)/P(y))可以推导该式。这里之所以称为朴素的原因就在于这里的事件是相互独立的。在这里x为分类的各种类型,y则是待预测集。这样就可以计算出该预测集为某类型分类的概率,并将该集归为概率大者一类,而这些在n维特征变量同样适用。

代码实现
bayes_model = GaussianNB()
bayes_model.fit(x_train,y_train)
y_bayes_pred = naive_bayes.predict(x_test)

6.K近邻

K近邻算法(KNN)也是十分简单,通俗地描述,就是预测数据在训练集中找寻K个距离最近的训练数据归为同类。

代码实现
#在经行模型建立之前,要在模型对象添入超参数
#n_neighbors:取邻近点的个数k
knn_model = KNN(n_neighbors=5)
knn_model.fit(x_train,y_train)
y_knn_pred.predict(x_test)

以上便是简单分类算法的概述,根据集成学习的思想,许多复合的分类模型(例如:AdaBoost、GBDT)在对拥有不同需求的分类任务及数据分布有着不同的适应能力。下一章将经行无监督学习的介绍,对其中的聚类经行了解,再在之后我们会了解到神经网络、深度学习,卷积更加深层次的知识,以更好的经行机器学习。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ultimo2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值