文章目录

  • 1、回归算法-线性回归分析
  • 2、线性回归实例:波斯顿房价预测
  • 3、回归性能评估
    • 3.1 梯度下降与正规方程的对比
  • 4 欠拟合和过拟合
    • 4.1 欠拟合解决办法
    • 4.2 过拟合解决办法
    • 4.3 L2正则化与岭回归
  • 4、分类算法-逻辑回归
  • 5、逻辑回归实例
  • 6、聚类算法-kmeans
  • 7、k-means实例
  • 8、k-means性能评估函数
  • 9 k-means总结

1、回归算法-线性回归分析

线性回归通过一个或者多个自变量与因变量之间进行建模的回归分析。其中可以为一个或多个自变量之间的线性组合(线性回归的一种)

一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上

损失函数(误差大小):
每个样本(真实值-预测值)的平方和,又称最小二乘法

因此我们的目的是找到使得损失函数最小的w值
求解方法:
法一:正规方程

sklearn.linear_model.LinearRegression()普通最小二乘线性回归coef_:回归系数

法二:梯度下降:面对训练数据规模十分庞大的任务
以单变量中的w0,w1为例:

α为学习速率,需要手动指定;
表示方向,可以理解为α为我一次跨多大的步,斜率为我要下山的方向
sklearn.linear_model.SGDRegressor

sklearn.linear_model.SGDRegressor( )通过使用SGD最小化线性模型coef_:回归系数

2、线性回归实例:波斯顿房价预测

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScale
# 获取数据
b = load_boston()# 分割数据集到训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)# 特征值和目标值是都必须进行标准化处理, 实例化两个标准化API
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目标值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train)
y_test = std_y.transform(y_test)# estimator预测
# 正规方程求解方式预测结果
lr = LinearRegression()lr.fit(x_train, y_train)print(lr.coef_)# 梯度下降去进行房价预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)# 预测测试集的房子价格
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("梯度下降测试集里面每个房子的预测价格:", y_sgd_predict)

3、回归性能评估

均方误差:
yi为预测值,¯y为真实值

sklearn回归评估API:

sklearn.metrics.mean_squared_error(y_true, y_pred)均方误差回归损失y_true:真实值y_pred:预测值return:浮点数结果

注:真实值,预测值为标准化之前的值

from sklearn.metrics import mean_squared_error
print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

3.1 梯度下降与正规方程的对比


线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor

4 欠拟合和过拟合


**过拟合:**一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

**欠拟合:**一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

对线性模型训练会过拟合

4.1 欠拟合解决办法

原因:
学习到数据的特征过少
解决办法:
增加数据的特征数量

4.2 过拟合解决办法

原因:
原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点

解决办法:
进行特征选择,消除关联性大的特征(很难做)
交叉验证(让所有数据都有过训练)
正则化:尽量减少高次项的影响,让这个系数接近于0,如让θ3和θ4趋近于0

4.3 L2正则化与岭回归

作用:可以使得W的每个元素都很小,都接近于0

优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象

带有正则化的线性回归-Ridge:

sklearn.linear_model.Ridge(alpha=1.0)具有l2正则化的线性最小二乘法alpha:正则化力度coef_:回归系数


正则化力度越大,w越趋向于0

岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让
估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研
究中有较大的实用价值。

# 岭回归去进行房价预测
from sklearn.linear_model import Ridge
rd = Ridge(alpha=1.0)
rd.fit(x_train, y_train)
print(rd.coef_)
#预测测试集的房子价格
y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
print("梯度下降测试集里面每个房子的预测价格:", y_rd_predict)
print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))

4、分类算法-逻辑回归

逻辑回归是解决二分类问题的利器

一、用线性回归的思路做分类
我们想根据人的饮食,作息,工作和生存环境等条件预测一个人"有"或者"没有"得恶性肿瘤,可以先通过回归任务来预测人体内肿瘤的大小,取一个平均值作为阈值,假如平均值为y,肿瘤大小超过y为恶心肿瘤,无肿瘤或大小小于y的,为非恶性.这样通过线性回归加设定阈值的办法,就可以完成一个简单的二分类任务:

上图中,红色的x轴为肿瘤大小,粉色的线为回归出的函数 hθ(x)的图像,绿色的线为阈值。
预测肿瘤大小还是一个回归问题,得到的结果(肿瘤的大小)也是一个连续型变量.通过设定阈值,就成功将回归问题转化为了分类问题.但是,这样做还存在一个问题,如果有一个超大的肿瘤在我们的例子中,阈值就很难设定,如果还是取平均值为阈值,则会出现下图的情况:

从上边的例子可以看出,使用线性的函数来拟合规律后取阈值的办法是行不通的,行不通的原因在于拟合的函数太直,离群值(也叫异常值)对结果的影响过大,但是我们的整体思路是没有错的,错的是用了太"直"的拟合函数,如果我们用来拟合的函数是非线性的,不这么直,是不是就好一些呢?
所以我们下面来做两件事:
1-找到一个办法解决掉回归的函数严重受离群值影响的办法.
2-选定一个阈值.

二、把回归函数掰弯
使用sigmod函数:


我们利用线性回归的办法来拟合然后设置阈值的办法容易受到离群值的影响,sigmod函数可以有效的帮助我们解决这一个问题,所以我们只要在拟合的时候把y = W^TX 换成

即可,其中z = W^TX 。同时,因为g(z)函数的特性,它输出的结果也不再是预测结果,而是一个值预测为正例的概率,预测为负例的概率就是1-g(z)

函数形式表达:
P(y=0|w,x) = 1 – g(z)
P(y=1|w,x) = g(z)
y^i 为某一条样本的预测值,取值范围为0或者1。

三、选择阈值
实际工作中并不一定是0.5,阈值的设定往往是根据实际情况来判断的。
0到1之间的数阈值选作0.5当然是看着最舒服的,可是假设此时我们的业务是像前边的例子一样,做一个肿瘤的良性恶性判断.选定阈值为0.5就意味着,如果一个患者得恶性肿瘤的概率为0.49,模型依旧认为他没有患恶性肿瘤,结果就是造成了严重的医疗事故.此类情况我们应该将阈值设置的小一些.阈值设置的小,加入0.3,一个人患恶性肿瘤的概率超过0.3我们的算法就会报警,造成的结果就是这个人做一个全面检查,比起医疗事故来讲,显然这个更容易接受.
第二种情况,加入我们用来识别验证码,输出的概率为这个验证码识别正确的概率.此时我们大可以将概率设置的高一些.因为即便识别错了又能如何,造成的结果就是在一个session时间段内重试一次.机器识别验证码就是一个不断尝试的过程,错误率本身就很高.

四、最大似然估计
我们想想要找到一组w,让P(正确)尽可能的大

想让预测出的结果全部正确的概率最大,根据最大似然估计就是所有样本预测正确的概率相乘得到的P(总体正确)最大,即求L(θ)最大


得到的这个函数越大,证明我们得到的W就越好.因为在函数最优化的时候习惯让一个函数越小越好,所以我们在前边加一个负号.得到公式如下:

这个函数就是我们逻辑回归(logistics regression)的损失函数,我们叫它交叉熵损失函数,值越小,那么预测的类别准确度更高

五、求解交叉熵损失函数
使用梯度下降法求解:
求解步骤如下:

1-随机一组W.
2-将W带入交叉熵损失函数,让得到的点沿着负梯度的方向移动.
3-循环第二步

损失函数求导:

5、逻辑回归实例

sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)Logistic回归分类器coef_:回归系数penalty=‘l2’ l2正则
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# 构造列标签名字
column = ['Sample code number','Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion', 'Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']# 读取数据
data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)
#包含16个缺失值,用”?”标出。
data = data.replace('?',np.nan)
data = data.dropna()
#选取目标值和特征值
x = data.loc[:,'Clump Thickness':'Mitoses']
y = data.loc[:,'Class']
#分割测试集和训练集
x_train,x_test,y_train,y_test = train_test_split(x, y,test_size = 0.25)
#对训练集和测试集进行标准化
s = StandardScaler()
x_train = s.fit_transform(x_train)
x_test = s.transform(x_test)
#进行回归预测
lg = LogisticRegression(C = 1.0)
lg.fit(x_train,y_train)
y_predict = lg.predict(x_test)
print('准确率为:',lg.score(x_test,y_test))
print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))

6、聚类算法-kmeans

步骤:
1、随机设置K个特征空间内的点作为初始的聚类中心
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程

API接口:

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)k-means聚类n_clusters:开始的聚类中心数量init:初始化方法,默认为'k-means ++’labels_:默认标记的类型,可以和真实值比较(不是值比较)

7、k-means实例

# 假设用户一共分为四个类别
km = KMeans(n_clusters=4)
km.fit(x)
predict = km.predict(x)
# 显示聚类的结果
plt.figure(figsize=(10,10))
# 建立四个颜色的列表
colored = ['orange', 'green', 'blue', 'purple']
colr = [colored[i] for i in predict]
plt.scatter(x[:, 1], x[:, 20], color=colr)
plt.xlabel("1")
plt.ylabel("20")
plt.show()
# 评判聚类效果,轮廓系数
silhouette_score(x, predict)

8、k-means性能评估函数

轮廓系数:范围为【-1,1】,越靠近1越好,现实中能接近0.7就算是不错的了

轮廓系数范围为【-1,1】,越靠近1越好。比如我分成了3个类别,分别是蓝色、红色和绿色
1、计算蓝色类别里的某个点i到蓝色内所有样本距离的平均值,记为ai
2、计算这个点到红色有样本的平均距离b1和绿色所有样本的平均距离b2,记为bi = min(b1,b2)
两种极端情况:
1、bi >> ai,1 完美
2、bi << ai -1 垃圾

sklearn.metrics.silhouette_score(X, labels)计算所有样本的平均轮廓系数X:特征值labels:被聚类标记的目标值

9 k-means总结

特点分析:
采用迭代式算法,直观易懂并且非常实用

缺点:容易收敛到局部最优解(多次聚类)
需要预先设定簇的数量(k-means++解决)

机器学习基础day3相关推荐

  1. 机器学习(1)机器学习基础 鸢尾花数据集

    目录 一.机器学习基础理论 1.机器学习过程 2.机器学习分类 3.数据集返回值介绍 二.鸢尾花数据集(实战) 1.首先是获取数据集 2.显示数据集信息(可以不要) 三.数据集划分 1.数据集划分AP ...

  2. 【直播】陈信达:零基础计算机视觉之机器学习基础

    零基础计算机视觉之机器学习基础 直播信息 分享嘉宾:陈信达,Datawhale成员,上海科技大学硕士. 直播时间:2021年07月30日 20:00 直播内容: 线性回归与指针读数识别 逻辑回归原理与 ...

  3. 资源 | Intel发布AI免费系列课程3部曲:机器学习基础、深度学习基础以及TensorFlow基础

    翻译 | AI科技大本营(公众号ID:rgznai100) 校对 | 成龙 编辑 | 明明 Intel于近期发布了三门AI系列的免费课程,分别是关于机器学习基础.深度学习基础.TensorFlow基础 ...

  4. python分类器鸢尾花怎么写_python机器学习基础教程-鸢尾花分类

    一: 环境准备: 1.导入的库: importnumpy as npimportmatplotlib.pyplot as pltimportpandas as pdimport mglearn 2.导 ...

  5. KNN算法的机器学习基础

    KNN算法的机器学习基础 https://mp.weixin.qq.com/s/985Ym3LjFLdkmqbytIqpJQ 本文原标题 : Machine Learning Basics with ...

  6. 机器学习基础(一)——人工神经网络与简单的感知器

    机器学习基础(一)--人工神经网络与简单的感知器 (2012-07-04 19:57:20) 转载▼ 标签: 杂谈 分类: machineのlearning 从最开始做数据挖掘而接触人工智能的知识开始 ...

  7. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  8. 【机器学习实战】第1章 机器学习基础

    第1章 机器学习基础 机器学习 概述 机器学习就是把无序的数据转换成有用的信息. 获取海量的数据 从海量数据中获取有用的信息 我们会利用计算机来彰显数据背后的真实含义,这才是机器学习的意义. 机器学习 ...

  9. 1.3 机器学习基础-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.2 偏差/方差 回到目录 1.4 正则化 机器学习基础 (Basic "Recipe" for Machine Learning) 上节课我们讲的是如 ...

最新文章

  1. 13_MFC工具条和状态栏
  2. 中兴智能视觉大数据公交车专用道移动智能电子警察系统功能、特点及优势详细介绍...
  3. std:: string 的常用使用
  4. Python——有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  5. Employee Assign Organization unit
  6. stotybord如何添加子视图_SQL复杂查询-子查询
  7. Qt杂记-QQuick之Android隐藏状态栏以及状态栏透明(QQuick项目)
  8. LFDMM源码剖析(融入词向量的概率图模型)
  9. 大前端之前后分离02】前端模板嵌套问题
  10. 【shell编程】1、shell编程简介
  11. 图神经网络概述(3):来自IEEE Fellow的GNN综述
  12. win7虚拟机_UTM 虚拟机不越狱运行 win7,百分百可以
  13. NodeJS运行时抛出: Error: listen EADDRINUSE :::3000
  14. mitmproxy抓https出现502Bad Gateway. unable to get local issuer certificate的解决方法
  15. 运放失真罪魁祸首之压摆率和增益带宽积
  16. 前端常用js方法工具封装
  17. redis 健康检查
  18. JavaScript -- 闭包与作用域链
  19. 远程库的使用,打标签与别名——Git的学习与使用(四)
  20. C#调用映美云打印机CFP535

热门文章

  1. python设计石头剪刀布游戏五次游戏体验_Python设计一个石头、剪刀、布游戏
  2. window7下安装Docker方法
  3. ps 2023(24.7beta) mac
  4. 移动版PC版微信登陆功能
  5. 逆战ajax和axios、fetch的区别
  6. 暖心!他曾在阿里楼下卖夜宵,今天却免费请阿里人吃102碗炒粉干
  7. android.mk中几个常见配置
  8. CreateProcess函数详解
  9. MS-SQLSERVER数据库SUSPECT状态如何解决(转)
  10. DeFi史上具备从0到1创新性的7个代币