机器学习——算法介绍-4

算法类别

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

2、线性回归实例

3、回归性能评估

4、分类算法-逻辑回归

5、逻辑回归实例

6、聚类算法-kmeans

7、k-means实例

回归算法-线性回归分析

期末成绩:0.7×考试成绩+0.3×平时成绩

西瓜好坏:0.2×色泽+0.5×根蒂+0.3×敲声
试图学得一个通过属性的线性组合来进行预测的函数:
f(x)=w_1x_1+w_2x_2+…+w_dx_d+b

w为权重,b称为偏置项,可以理解为:w0×1,可以理解为最初的权重
对于一些简单的数据可以轻易的通过分布图看出结果

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
plt.scatter([60,72,75,80,83],[126,151.2,157.5,168,174.3])
plt.show()

在这里插入图片描述
那如果是多特征,就需要其他方法了

线性回归

定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合

一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上,即多个特征作用的结果
在这里插入图片描述
预测结果与真实值是有一定的误差

特征与权重的计算
在这里要避免与列表的计算混淆
列表

a=[[1,2,3,5],[1,2,3,4]]
b=[2,2,2,2]
np.multiply(a,b)

在这里插入图片描述
列表

b=[[2]]
#数组运算并非所希望的结果
np.multiply(a,b)

在这里插入图片描述
矩阵

b=[[2],[2],[2],[2]]
np.dot(a,b)

在这里插入图片描述

损失函数(误差大小)

目的是希望真实值和预测值之间的误差最小,那么就需要一个可以评价误差的函数
求每个样本距离方差和,来评价
在这里插入图片描述
如何去求模型当中的W,使得损失最小?
(目的是找到最小损失对应的W值)

最小二乘法之正规方程

注:X,y代表着什么?
在这里插入图片描述

X为特征值矩阵,y为目标值矩阵
x为每个样本的特征值
y为他们的结果
在这里插入图片描述
为什么会有-1?
这代表了这个矩阵的逆
原矩阵x逆=单位矩阵
在这里插入图片描述
缺点:当特征过于复杂,求解速度太慢
对于复杂的算法,不能使用正规方程求解(逻辑回归等)

损失函数直观图(单变量举例)

往往大数据情况下,多特征,多数据不会如此平滑,正轨方程几乎不会得到结果
想要一次求出权重很难
在这里插入图片描述

最小二乘法之梯度下降

我们以单变量中的w0,w1为例子:
在这里插入图片描述
理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新W值

使用:面对训练数据规模十分庞大的任务
在这里插入图片描述
在这里插入图片描述

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

sklearn线性回归正规方程、梯度下降API
sklearn.linear_model.LinearRegression
正规方程

sklearn.linear_model.SGDRegressor
梯度下降

LinearRegression、SGDRegressor

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

线性回归实例

1、sklearn线性回归正规方程、梯度下降API
2、波士顿房价数据集分析流程

波士顿房价数据案例分析流程

伪代码
1、波士顿地区房价数据获取
lb=load_boston()
2、波士顿地区房价数据分割
x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
print(lb.feature_names)
print(x_test)
查看特征矩阵的值
数值并不规则,需要进行标准化才能吸纳所有特征
在这里插入图片描述

3、训练与测试数据标准化处理
训练集标准化是为了使用有效的特征,为什么目标值也需要标准化?
这和分类模型不同,分类的类别是固定的,这里的结果是连续值,预测的结果肯定和真实值有差异,直接相等是行不通的,应该计算的是预测值和真实值之间的均方方差来判断差距
因为目标值的差异也很大,目的是为了求出权重模型
std_x=StandardScaler()
std_y=StandardScaler()
x_train=std_x.fit_transform(x_train)
x_test=std_x.fit_transform(x_test)
在这里插入图片描述
1.9最新版本对标准化api有规定,需要输入的数据是二维的,可以使用y_train.reshap(-1,1 )对其进行转化
前面是样本数,后面是目标值的数,-1代表对于特征值未知,1代表只有一个目标值
总结标准化转换器如下。传入数据
0.18 ⼆维,1维都可以
0.19 转换器,estimator 要求数据必须是⼆维

y_train=std_y.fit_transform(y_train)
y_test=std_y.fit_transform(y_test)
在这里插入图片描述

4、使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测
线性回归模型预测
lr=LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_)
权重参数
在这里插入图片描述
预测结果
y_lr_predict=lr.predict(x_test)
得到的值都是非常小的,因为被标准化了
y_lr_predict=std_y.inverse_transform(y_lr_predict)
想要得到标准化之前的数据就翻转一下
在这里插入图片描述
计算正规方程的均方误差
print(mean_squared_error(y_lr_predict,y_test))
0.4155910316305712

梯度下降算法进行预测
需要指定学习率,可以默认
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)
在这里插入图片描述
求均方误差
print(mean_squared_error(y_sgd_predict,y_test))
0.4464573108886242
5. 得到预测结果后还需要计算他们的均方误差是多少来判断差距
为什么不使用准确率?
这不是分类,预测和结果肯定有差异,只能使用方差来判定差距
从结果来看,sgd比正规方程也好不到哪里,实际上如果特征少,数据少,要根据实际结果选择算法模型
完整代码

def mylinear():
    """
    线性回归直接预测房子价格
    :return: None
    """
    # 获取数据
    lb = load_boston()

    # 分割数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train, y_test)

    # 进行标准化处理(?) 目标值处理?
    # 特征值和目标值是都必须进行标准化处理, 实例化两个标准化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)

    # 预测房价结果
    model = joblib.load("./tmp/test.pkl")

    y_predict = std_y.inverse_transform(model.predict(x_test))

    print("保存的模型预测的结果:", y_predict)

    # estimator预测
    # 正规方程求解方式预测结果
    # lr = LinearRegression()
    #
    # lr.fit(x_train, y_train)
    #
    # print(lr.coef_)

    # 保存训练好的模型
    # joblib.dump(lr, "./tmp/test.pkl")

    # # 预测测试集的房子价格
    # y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
    #
    # print("正规方程测试集里面每个房子的预测价格:", y_lr_predict)
    #
    # print("正规方程的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
    #
    # # 梯度下降去进行房价预测
    # 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)
    #
    # print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
    #
    # # 岭回归去进行房价预测
    # 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))

    return None

回归性能评估

(均方误差(Mean Squared Error)MSE) 评价机制:
类似方差,只不过减的不是平均值
在这里插入图片描述

sklearn回归评估API

sklearn.metrics.mean_squared_error

mean_squared_error

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

注:真实值,预测值为标准化之前的值
在这里插入图片描述

1、LinearRegression与SGDRegressor评估

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

问题:训练数据训练的很好啊,误差也不大,为什么在测试集上 面有问题呢?

过拟合与欠拟合

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

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

欠拟合原因以及解决办法

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

过拟合原因以及解决办法

原因:
原始特征过多,存在一些嘈杂特征,
模型过于复杂是因为模型尝试去兼顾
各个测试数据点
解决办法:
进行特征选择,消除关联性大的特征(很难做)
交叉验证(让所有数据都有过训练)
正则化(了解)
对线性模型训练会变成复杂模型
模型复杂的原因:数据的特征和⽬标值之间的关系不仅仅是线性关系
在这里插入图片描述
这里降低影响是降低权重,至于x^4是本身的数据,是不能改的
在这里插入图片描述
怎么发现出现了拟合误差?
从交叉验证中看出来,观察法,

交叉验证:训练集结果:表现不⾏| 结果99%,2.0误差
测试集:表现不⾏ | 结果89%,10.0误差
⽋拟合 | 过拟合

L2正则化

不断的调整权重逼近最合适的参数
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
l2和决策树都有特征选择的过程
特征选择:过滤式:低⽅差特征
嵌⼊式:正则化,决策树,神经⽹络

回归:解决过拟合的⽅式
线性回归:LInearRegression 容易出现过拟合,为了把训练集数据表现更好
L2正则化:Ridge:岭回归 带有正则化的线性回归 解决过拟合

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

sklearn.linear_model.Ridge

Ridge

sklearn.linear_model.Ridge(alpha=1.0)
具有l2正则化的线性最小二乘法

alpha:正则化力度,超参数
coef_:回归系数
观察正则化程度的变化,对结果的影响?
随着正则化力度的不断加强,权重越来越 倾向于0
在这里插入图片描述

线性回归 LinearRegression与Ridge对比

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

模型保存

对于模型,训练好后可以保留下来,下次可以直接使用
因为需要的仅仅是模型的参数而已
在这里插入图片描述
在这里插入图片描述

分类算法-逻辑回归

逻辑回归是解决二分类问题的利器
比如广告投放后预测用户是否会点击,可以得到概率,以此来提高广告点击率
在这里插入图片描述

sigmoid函数

特点是可以将任何大小的数都变成【0,1】之间的数据,这样就可以理解为概率值,方便解析
在这里插入图片描述

逻辑回归公式

在这里插入图片描述
输出:[0,1]区间的概率值,默认0.5作为阀值
注:g(z)为sigmoid函数
e=2.71

逻辑回归的损失函数、优化

与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解
对数似然损失函数:
在这里插入图片描述
完整的损失函数:
在这里插入图片描述
如何理解这个完整的损失函数呢?
像不像信息熵?x*log(概率)
结果越小标明越接近最终结果
举个例子
有四个样本,分为两类,
阈值设定为0.5,然后逻辑回归预测每个样本属于哪一类的类别得到预测为每个分类的概率
在这里插入图片描述
最后根据损失函数求出预测的损失值
损失值当然是越小越好,这代表信息熵对于目标更加的笃定,机器学习的过程就是将损失函数值不断企图降低的过程
在这里插入图片描述

均方误差和逻辑回归比较

损失函数:均⽅误差 (不存在多个局部最低点) 只有⼀个最⼩值 可以直接求解
对数似然损失: 多个局部最⼩值,这就是机器学习面临的问题
机器学习可能会陷入局部最优解中,从而让学习达不到效果
在这里插入图片描述
现在的办法只能缓解这种情况,而不能彻底解决
1、多次随机初始化,多次⽐较最⼩值结果, 用数量战胜质量
2、求解过程当中,调整学习率, 希望学习的快一点,绕过那些小的坑坑洼洼

cost损失的值越小,那么预测的类别准确度更高
判断时只判断一个目标类别的概率,那么另一个也自然可以得到
在这里插入图片描述
在这里插入图片描述

sklearn逻辑回归API

sklearn.linear_model.LogisticRegression

LogisticRegression

sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)
正则化,超参数
Logistic回归分类器
coef_:回归系数

LogisticRegression回归案例

良/恶性乳腺癌肿瘤预测
只能解决二分类问题

正例和反例的情况
一般以案例比较少的作为正例,因为数量多的作为正例未必能反应真实情况
在这里插入图片描述
哪⼀个类别少,判定概率值是值得这个类别
恶性 正例
良性 反例
如果恶性样本比例更高,则良性为反例,如此

良/恶性乳腺癌肿数据

https://archive.ics.uci.edu/ml/index.php

原始数据的下载地址:
https://archive.ics.uci.edu/ml/machine-learning-databases/

数据描述
(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤
相关的医学特征,最后一列表示肿瘤类型的数值。
(2)包含16个缺失值,用”?”标出。

pandas使用

pd.read_csv(’’,names=column_names)
column_names:指定类别名字,[‘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’]
return:数据

replace(to_replace=’’,value=):返回数据
dropna():返回数据

良/恶性乳腺癌肿分类流程

1、网上获取数据(工具pandas)

2、数据缺失值处理、标准化

3、LogisticRegression估计器流程
完整代码

def logistic():
    """
    逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
    :return: NOne
    """
    # 构造列标签名字
    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)

    print(data)

    # 缺失值进行处理
    data = data.replace(to_replace='?', value=np.nan)

    data = data.dropna()

    # 进行数据的分割
    x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)

    # 进行标准化处理
    std = StandardScaler()

    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 逻辑回归预测
    lg = LogisticRegression(C=1.0)

    lg.fit(x_train, y_train)

    print(lg.coef_)

    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=["良性", "恶性"]))

    return None

LogisticRegression总结

应用:广告点击率预测、电商购物搭配推荐
优点:适合需要得到一个分类概率的场景
缺点:当特征空间很大时,逻辑回归的性能不是很好
(看硬件能力)

同样是分类问题,朴素贝叶斯可以对文本进行分类,两者的异同

在这里插入图片描述
典型代表:k-近邻,决策树,随机森林,神经⽹络都是判别模型
隐马尔可夫模型是生成模型

多分类问题

softmax可以解决多分类问题,一般图像识别上使用
逻辑回归解决办法:1V1,1Vall
在这里插入图片描述
softmax方法-逻辑回归在多分类问题上的推广
将在后面的神经网络算法中介绍

非监督学习的特点?

“物以类聚,人以群分”
没有目标值,而是总结他们的特点
在这里插入图片描述

非监督学习(unsupervised learning)

主要方法:k-means

k-means步骤

1、随机设置K个特征空间内的点作为初始的聚类中心

2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类
中心点作为标记类别

3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平
均值)

4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行
第二步过程

总结下来就是
每个点,计算出到设置的中心点的距离,那个最近,就把自己认为是哪一类,形成以这个点为中心的组群,这样一轮过后,所有点的都在各自的族群里

然后就划分好的组群再寻找新的中心点,
超参数是k,决定好划分几类
在这里插入图片描述

k-means API

sklearn.cluster.KMeans

Kmeans

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
k-means聚类
n_clusters:开始的聚类中心数量
init:初始化方法,默认为’k-means ++’

labels_:默认标记的类型,可以和真实值比较(不是值比较)

k-means对Instacart Market用户聚类

1、降维之后的数据

2、k-means聚类
数据集有27个特征,根据这些数据为用户分类
3、聚类结果显示
可以使用散点图表示,将聚类得到的结果,用0 1 2 3表示,为每个类别的标上不同的颜色
在这里插入图片描述

在这里插入图片描述

至于散点图的xy坐标,抽出特征里的两个特征表示即可

在这里插入图片描述
完整代码

import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
# 读取四张表的数据
prior = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")
# 合并四张表到一张表  (用户-物品类别)
_mg = pd.merge(prior, products, on=['product_id', 'product_id'])
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])
mt.head(10)
# 交叉表(特殊的分组工具)
cross = pd.crosstab(mt['user_id'], mt['aisle'])
cross.head(10)
# 进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
# 把样本数量减少
x = data[:500]
x.shape
# 假设用户一共分为四个类别
km = KMeans(n_clusters=4)
km.fit(x)
predict = km.predict(x)
predict
# 显示聚类的结果
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)

Kmeans性能评估指标

轮廓系数:
在这里插入图片描述
注:对于每个点i 为已聚类数据中的样本 ,b_i 为i 到其它族群的所有样本的平均距离,a_i 为i 到本身簇的距离平均值

聚类的效果如图
在这里插入图片描述
肯定是外部距离最大化,内部距离最小化为好
评价好坏,计算轮廓系数
1、计算蓝1到⾃身类别的点距离的平均值a_i
2、计算蓝1分别到红⾊类别,绿⾊类别所有的点的距离,求出平均值 b1, b2,取其中最⼩的值当做b_i
最好的情况是x-0/x=1
最差的情况是0=x/x=-1
因此轮廓系数 [-1, 1]
极端:
b_i>>a_i: 1 完美
a_i>> b_i: -1 最差

最终计算出所有的样本点的轮廓系数平均值
在这里插入图片描述

Kmeans性能评估指标API

sklearn.metrics.silhouette_score

silhouette_score

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

Kmeans总结

特点分析:
采用迭代式算法,直观易懂并且非常实用
缺点:容易收敛到局部最优解(多次聚类)
需要预先设定簇的数量(k-means++解决)

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值