Python入门到实战(十)机器学习中分类问题,逻辑回归、KNN、决策树、朴素贝叶斯、商场异常消费数据预测、判断员工是否适合相关工作、预测学生录取及奖学金情况

Python入门到实战(十)机器学习中分类问题,逻辑回归、KNN、决策树、朴素贝叶斯、商场异常消费数据预测、判断员工是否适合相关工作、预测学生录取及奖学金情况

区分回归任务和分类任务:

回归

要认清,回归是指对连续性数值预测
模型输出的也是连续型数值

分类

分类是对非连续性数值判断类别
模型输出的是非连续型标签

逻辑回归->分类

上节中讨论了对于如何使用线性模型进行进行回归学习,但若要做的是分类任务该怎么办呢?
其解蕴藏在广义线性模型中、
考虑二分类任务的输出标记y属于{0,1},且线性回归模型产生的预测值Z=(w^T)*x+b是实值、于是将实值z转换为1/0值,最理想的是“单位越阶函数”(unit-step function)
在这里插入图片描述
若是x>0,判正例
若x<0,则为反例
若x=0临界值,则为0.5,可随意判别
哎呦因为单位越阶函数不连续,因此不能直接用做广义线性模型中的g-(.)
所以希望在找到在一定程度上接近单位越阶函数的“替代函数”,并希望函数可以微调,对数几率函数就是这样一个常用的替代函数。在这里插入图片描述
虽然名字是回归,但是实际是一种分类学习方法。
其中要注意决策边界的问题、

逻辑回归进行二分类

不同的模型是没有绝对地优劣势,只是使用场景不同

逻辑回归logistics regression:

根据数据特征,计算样本归属于某一类别的概率P(x),根据概率数值判断所属类别
**核心:**基于逻辑回归方程,计算类别概率
优点:
输出值自然地落在0-1之间,并且具有概率意义
参数代表每个特征对输出的影响,可解释性强
实施简单,非常高效(计算量小,内存占低)可在大数据中使用
缺点
本质是线性分类器,对特征相关度高的情况效果不好
特征空间很大时,性能不好
适用需要较为清晰地理解每个属性对于结果的影响

逻辑回归实现产品的分类:

问题描述:根据数据,建立回归模型,计算并绘制边界曲线,并预测x1=1,x2=10点数据属于什么类别

解决步骤

1.基于初始数据建立逻辑回归模型,评估模型表现
#load data
import pandas as pd
import numpy as np
data=pd.read_csv('task1_data.csv')
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(data.loc[:,'尺寸1'],data.loc[:,'尺寸2'])
plt.title('chip size1-size2')
plt.xlabel('size1')
plt.ylabel('size2')
plt.show()

在这里插入图片描述

#合格与不合格分别可视化标识
mask=data.loc[:,'y']==1
print(mask)
from matplotlib import pyplot as plt
fig1=plt.figure()
ok=plt.scatter(data.loc[:,'尺寸1'][mask],data.loc[:,'尺寸2'][mask])
ng=plt.scatter(data.loc[:,'尺寸1'][~mask],data.loc[:,'尺寸2'][~mask]) 
plt.title('chip size1-size2')
plt.xlabel('size1')
plt.ylabel('size2')
plt.legend((ok,ng),('ok','ng'))
plt.show()

在这里插入图片描述

#x,y赋值
x=data.drop(['y'],axis=1)
y=data.loc[:,'y']
#模型建立与训练
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()
model.fit(x,y)
#模型预测
y_predict=model.predict(x)
#模型评估
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)
print(accuracy)
1.0

准确率accuracy很好评估,就是拿你训练出来模型预测出的结果y^和初始的y做一个比对,看是否一致。
1表示完全拟合了

2.预测x1=1,x2=10时产品是良品还是次品
x_test=np.array([[1,10]])
#测试样本预测
y_test_p=model.predict(x_test)
print('ok' if y_test_p==1 else 'ng')

输出ng其实就是次品

3.获取边界函数参数,绘制边界曲线

边界函数:theta0+theta1x1+theta2x2=0

#获取边界函数的参数
theta0=model.intercept_[0]
theta1,theta2 =model.coef_[0][0],model.coef_[0][1]
print(theta0,theta1,theta2)

2.7887965961686616 2.730580148169416 -2.825547547161019
对应的三个参数

X1=data.loc[:,'尺寸1']
X2_new=-(theta0+theta1*X1)/theta2

X1就是X对应的值拿进去训练后在画图里加上plt.plot(X1,X2_new)
在这里插入图片描述

商场异常消费数据预测:

问题描述:根据数据,建立二阶多项式逻辑回归模型实现异常数据消费数据预测,与线性逻辑回归模型结果进行对比

解决步骤

1.建立线性边界的逻辑回归模型,评估表现
#load data
import pandas as pd
import numpy as np
data=pd.read_csv('task2_data.csv')
fig1=plt.figure()
abnormal=plt.scatter(data.loc[:,'pay1'][mask],data.loc[:,'pay2'][mask])
normal=plt.scatter(data.loc[:,'pay1'][~mask],data.loc[:,'pay2'][~mask])
plt.title('pay1&pay2')
plt.xlabel('pay1')
plt.ylabel('pey2')
plt.legend((abnormal,normal),('abnormal','normal'))
plt.show()

在这里插入图片描述

#x,y 赋值
x=data.drop(['y'],axis=1)
y=data.loc[:,'y']
x.head()
y.head()
#模型训练
from sklearn.linear_model import LogisticRegression
LR1=LogisticRegression()
LR1.fit(x,y)
#模型预测
y_predict=LR1.predict(x)
#准确率
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)
print(accuracy)

准确率只有80.2.

#可视化边界,边界函数参数获取
theta0=LR1.intercept_
theta1,theta2=LR1.coef_[0][0],LR1.coef_[0][1]
X1=data.loc[:,'pay1']
X2_new=-(theta0+theta1*X1)/theta2
#draw
fig2=plt.figure()
abnormal=plt.scatter(data.loc[:,'pay1'][mask],data.loc[:,'pay2'][mask])
normal=plt.scatter(data.loc[:,'pay1'][~mask],data.loc[:,'pay2'][~mask])
plt.plot(X1,X2_new)
plt.title('pay1&pay2')
plt.xlabel('pay1')
plt.ylabel('pey2')
plt.legend((abnormal,normal),('abnormal','normal'))
plt.show()

在这里插入图片描述

2.建立二阶多项式边界的逻辑回归模型,对比其与先行边界的表现
X2=data.loc[:,'pay2']
#生成二次项
X1_2=X1*X1
X2_2=X2*X2
X1_X2=X1*X2
#创建二分的类边界数据
X_new={'X1':X1,'X2':X2,'X1_2':X1_2,'X2_2':X2_2,'X1_X2':X1_X2}
X_new=pd.DataFrame(X_new)
#建立新模型
LR2=LogisticRegression()
LR2.fit(X_new,y)
#模型预测
y2_predict=LR2.predict(X_new)
#准确率
accuracy2=accuracy_score(y,y2_predict)
print(accuracy2)

用二次项进行预测后,准确率达到了97.4,只一个巨大的提升

3.预测pay1=80,pay2=20时对应消费是否为异常消费
#新样本预测pay1=80,pay2=20
X_test=np.array([[80,20,80*80,20*20,80*80]])
y_predict=LR2.predict(X_test)
print(X_test)
print('abnormal' if y_predict==1 else 'normal')

[[ 80 20 6400 400 6400]]
normal

4.获取边界函数参数、绘制边界函数

在对比过准确率后画出边界函数
在这里插入图片描述

#边界函数参数获取
theta0=LR2.intercept_
theta1,theta2,theta3,theta4,theta5=LR2.coef_[0][0],LR2.coef_[0][1],LR2.coef_[0][2],LR2.coef_[0][3],LR2.coef_[0][4]

X1_new=X1.sort_values()

a=theta4
b=theta5*X1_new+theta2
c=theta0+theta1*X1_new+theta3*X1_new*X1_new
X2_new_2=(-b+np.sqrt(b*b-4*a*c))/(2*a)

fig2=plt.figure()
abnormal=plt.scatter(data.loc[:,'pay1'][mask],data.loc[:,'pay2'][mask])
normal=plt.scatter(data.loc[:,'pay1'][~mask],data.loc[:,'pay2'][~mask])
plt.plot(X1_new,X2_new_2)
plt.title('pay1&pay2')
plt.xlabel('pay1')
plt.ylabel('pey2')
plt.legend((abnormal,normal),('abnormal','normal'))
plt.show()

在这里插入图片描述

KNN K-nearest neighbors

当要对样本进行分类时,先看周边的样本属于什么类别,归入其中
(物以类聚,人以群分)
优点
简单容易理解、易于实现、无需要估计参数,无需求解训练
适合对稀有事件分类
多分类场景中也不会增加训练复杂度,适合多分类问题
缺点
因为不需要多求解theta参数,只要求新样本与原样本距离,故为懒惰算法。对测试样本分类时的计算量大,要扫描所有的训练样本,内存开销大
完全跟着数据走,没有数学模型可言,无法检查不同属性对结果的影响
样本不平衡时,比如一类多一类少,导师输入新样本时,其中K个邻居中大容量类的样本占多数
适用
需要一个容易解释的模型的时候

决策树decision tree

一种对实例进行分类的树形结构。通过多层判断区分目标所属类别本质,通过多层判断,从训练数据集中归纳出一组分类规则
优点
计算量小,速度快
步骤清晰,好理解
缺点
忽略属性的相关性
样本类别不均匀,容易影响模型表现
适用
需要清晰地描述类别判断地前后逻辑(先依据哪个指标判断,接下来使用哪个指标)

决策树判断员工是否适合相关工作

建立决策树模型,计算准确率

import pandas as pd
import numpy as np
data = pd.read_csv('task1_data.csv')
#X y赋值
X = data.drop(['y'],axis=1)
y = data.loc[:,'y']
#建立决策树模型
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(criterion='entropy',min_samples_leaf=5)
#模型训练
model.fit(X,y)
#模型预测
y_predict = model.predict(X)
#准确率指标评估
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict)
print(accuracy)

0.85

预测申请者skill=1,exp=0,degree=1,income=1是否适合该工作

#测试样本预测
X_test = np.array([[1,0,1,1]])
y_test_predict = model.predict(X_test)
print('yes' if y_test_predict==1 else 'no')

yes

可视化模型结构

from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(200,200))
from sklearn import tree
tree.plot_tree(model,filled='True',feature_names=['Skill','Experience','Degree','Income'],class_names=['Un-qualified','Qualified'])
fig1.savefig('dc_result.png')

在这里插入图片描述

修改min_samples_leaf参数,对比模型结果

model2 = DecisionTreeClassifier(criterion='entropy',min_samples_leaf=50)
#模型训练
model2.fit(X,y)
y_predict2 = model2.predict(X)
accuracy2 = accuracy_score(y,y_predict2)
print(accuracy2)
fig2 = plt.figure(figsize=(200,200))
tree.plot_tree(model2,filled='True',feature_names=['Skill','Experience','Degree','Income'],class_names=['Un-qualified','Qualified'])
#设置字体
import matplotlib as mpl
mpl.rcParams['font.family'] = 'SimHei'
fig3 = plt.figure(figsize=(200,200))
tree.plot_tree(model2,filled='True',feature_names=['技能','经验','学历','薪资'],class_names=['不适合','适合'])
fig3.savefig('final_result.png')

0.83
在这里插入图片描述

朴素贝叶斯

前提:不同属性之间相互独立;基于训练数据集(X,Y)与贝叶斯概率公式,机器学习从输入到输出的概率分布,计算求出使得后验概率最大的类别作为预测输出。
优点
源于古典数学理论,分类逻辑清晰
可清晰查看各个类别对应概率,观察数据改变的概率变化,帮助理解预测过程
缺点
在属性个数比较多或者属性之间相关性较大时,分类效果不好
对先验概率依赖度高,样本类别分布不均匀时,容易影响模型表现
假设:各属性之间相互独立
在这里插入图片描述

朴素贝叶斯预测学生录取及奖学金情况

在这里插入图片描述

属性值意义:
成绩:0:不及格;1:及格;2:优秀
学校:0:普通;1:重点
获奖:0:无;1:有
性别:0:女;1:男
英语:0:普通;1:优秀
Y结果:0未录取;1:录取;2:带奖学金录取

计算模型对训练数据各样本预测各类别的概率及输出类别结果,计算模型准确率

import pandas as pd
import numpy as np
data=pd.read_csv('scholarTask2_data.csv')
#x,y赋值
x=data.drop(['y'],axis=1)
y=data.loc[:,'y']
#创建贝叶斯模型训练
from sklearn.naive_bayes import CategoricalNB
model=CategoricalNB()
#模型训练
model.fit(x,y)
#训练数据的概率预测
y_predict_prob=model.predict_proba(x)
#训练的预测
y_predict=model.predict(x)
#计算模型准确率
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)
print(accuracy)

0.6833333333333333

观察测试样本数据并观察预测每个样本的结果,然后结合模型计算对应类别概率、与结果,将两个结果进行对比

#5个样本
x_test=np.array([[2,1,1,1,1],[2,1,1,1,0],[2,1,1,0,0],[2,1,0,0,0],[2,0,0,0,0]])
y_test_predict_prob=model.predict_proba(x_test)
y_test_predict=model.predict(x_test)
[[0.15246575 0.34559122 0.50194304]
 [0.20270024 0.39989757 0.39740219]
 [0.15786683 0.45482276 0.38731042]
 [0.38753488 0.44680162 0.1656635 ]
 [0.59472319 0.29337952 0.11189729]]
[2 1 1 1 0]
#确认存储数据
print(x_test)
print(y_test_predict_prob)
print(y_test_predict)
print(x_test.shape,y_test_predict_prob.shape,y_test_predict.shape)
[[2 1 1 1 1]
 [2 1 1 1 0]
 [2 1 1 0 0]
 [2 1 0 0 0]
 [2 0 0 0 0]]
[[0.15246575 0.34559122 0.50194304]
 [0.20270024 0.39989757 0.39740219]
 [0.15786683 0.45482276 0.38731042]
 [0.38753488 0.44680162 0.1656635 ]
 [0.59472319 0.29337952 0.11189729]]
[2 1 1 1 0]
(5, 5) (5, 3) (5,)

将测试样本数据、预测概率、结果以CSV格式存储到本地

#数据组合
test_data_result=np.concatenate((x_test,y_test_predict_prob,y_test_predict.reshape(5,1)),axis=1)
#格式转换
test_data_result=pd.DataFrame(test_data_result)
#列名称替换
test_data_result.columns=['score','school','award','gender','english','p0','p1','p2','y_test_predict']
test_data_result.head()

在这里插入图片描述

test_data_result.to_csv('scholar_test_data_result.csv')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会写程序的程序员.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值