分类问题

实例1,垃圾邮件检测。

任务:判断是否为垃圾邮件

输入:邮件

输出:是/不是垃圾邮件

实例2:图片分类

分类:根据已知样本的某些特征,判断一个样本属于哪个已知的样本类。

分类任务与回归任务的区别

回归任务--

回归目标:建立函数关系

模型输出:连续型数值 如1到20000的任意数,可以是整数也可以是小数,有理数无理数。

回归(Regression) 的核心含义是:根据已知的输入数据,预测一个连续型的输出值

分类任务---

分类目标:判断类别

模型输出:非连续型标签 如(pass/failed;0,1,2....)

sigmoid函数的引出

(x1,x2)——>y  y就是分类结果。0为红色圆球,1为蓝色三角。

如何将一个 \theta _{1}x_{1}+\theta _{2}x_{2}+\omega =y的线性函数(函数y的取值范围是负无穷,到正无穷)转为一个取值范围在0~1之间的概率分布。

这时候就需要引入sigmoid函数了。\frac{1}{1+e^{-x}}=p(x)

在这个图中 Z=\omega ^{T}x  其中\omega ^{T}是各参数 Z的取值范围是负无穷到正无穷

转化sigmoid函数就是 \frac{1}{1+e^{-\omega ^{T}}}=p(x)   

就是说当P(x)大于等于0.5时我们认为趋近于1,就是分类1

当P(x)小于0.5时,认为趋近0,就是分类0

所以我们的目标就是根据训练集,找出sigmoid函数中合适的\omega _{1} \omega _{2} \omega _{3}\cdots这些个参数

sigmoid函数对应的损失函数

当然sigmoid函数也是损失函数,找寻最优参数的过程也是依托损失函数来根据数据集逐渐收敛找出的。

你想知道的 sigmoid 函数对应的损失函数,其实就是逻辑回归的对数似然损失(也叫交叉熵损失) —— 这是专门为二分类场景、适配 sigmoid 输出(概率值)设计的损失函数,核心是惩罚模型对样本类别的错误预测。

===============================================

import numpy as np
import pandas as pd
data = pd.read_csv('examdata_extended.csv')
data.head()
#画图看看
from matplotlib import pyplot as plt
fig1 = plt.figure()
plt.scatter(data.loc[:,'Exam1'],data.loc[:,'Exam2'])
plt.show()

#加上标识
mask = data.loc[:,'Pass']==1
mask.head()
fig2 = plt.figure()
'''data.loc[:, 'Exam1'][mask] 是什么意思?
先取 Exam1 这一列的所有数据,然后用 mask 这个 “筛子” 过滤。
效果:只保留 mask 中为 True 位置对应的分数,也就是只保留通过学生的 Exam1 分数。'''
plt.xlabel('Exam1')
plt.ylabel('Exam2')
passed = plt.scatter(data.loc[:,'Exam1'][mask],data.loc[:,'Exam2'][mask])
failed = plt.scatter(data.loc[:,'Exam1'][~mask],data.loc[:,'Exam2'][~mask])  #~是取反
plt.legend((passed,failed),('passed','failed'))
plt.show()

#把训练集赋值给X,Y方便训练
X = data.drop('Pass',axis=1)
X.head()
Y = data.loc[:,'Pass']
Y.head()
#把Exam1与Exam2也搞一下以防万一
X1 = data.loc[:,'Exam1']
X2 = data.loc[:,'Exam2']
# 开始建立logicregression模型,并训练
from sklearn.linear_model import LogisticRegression
LR1 = LogisticRegression()
LR1.fit(X,Y)
Y_predict = LR1.predict(X)
#评估下模型
from sklearn.metrics import accuracy_score 
acy = accuracy_score(Y,Y_predict)
print(acy)
acy = 0.942  精确度还可以
#预测下当Exam1=70 Exam2 =65时是否能通过
y_test = LR1.predict([[70,65]])
print( 'passed'if y_test==1 else 'failed')

passed

# 画出边界函数
theta0 = LR1.intercept_
theta1 = LR1.coef_[0][0]
print(theta1)
theta2 = LR1.coef_[0][1]
X1 = data.loc[:,'Exam1']
#根据边界函数  theta0+theta1*X1+theta2*X1 = 0,输入Exam1,反推Exam2_new
Exam2_new = (-theta0-theta1*X1)/theta2
fig3 = plt.figure()
plt.xlabel('Exam1')
plt.ylabel('Exam2')
passed = plt.scatter(data.loc[:,'Exam1'][mask],data.loc[:,'Exam2'][mask])
failed = plt.scatter(data.loc[:,'Exam1'][~mask],data.loc[:,'Exam2'][~mask])  #~是取反
plt.legend((passed,failed),('passed','failed'))
plt.plot(X1,Exam2_new)

更多推荐