机器学习(三)

机器学习(三).png

回归和聚类

线性回归
欠拟合与过拟合
岭回归

分类算法:逻辑回归

模型保存与加载

无监督学习 K-means算法

4.1 线性回归

回归问题:
    目标值 - 连续型的数据
4.1.1 线性回归的原理
    2 什么是线性回归
        函数关系 特征值和目标值
        线型模型
            线性关系
        y = w1x1 + w2x2 + w3x3 + …… + wnxn + b
          = wTx + b
        数据挖掘基础
        y = kx + b
        y = w1x1 + w2x2 + b
        y = 0.7x1 + 0.3x2
        期末成绩:0.7×考试成绩+0.3×平时成绩
        [[90, 85],
        []]
        [[0.3],
        [0.7]]
        [8, 2] * [2, 1] = [8, 1]
        广义线性模型
            非线性关系?
            线性模型
                自变量一次
                 y = w1x1 + w2x2 + w3x3 + …… + wnxn + b
                参数一次
                 y = w1x1 + w2x1^2 + w3x1^3 + w4x2^3 + …… + b
            线性关系&线性模型
            线性关系一定是线性模型
            线性模型不一定是线性关系
     4.1.2 线性回归的损失和优化原理(理解记忆)
        目标:求模型参数
            模型参数能够使得预测准确
        真实关系:真实房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
        随意假定:预测房子价格 = 0.25×中心区域的距离 + 0.14×城市一氧化氮浓度 + 0.42×自住房平均房价 + 0.34×城镇犯罪率
        损失函数/cost/成本函数/目标函数:
            最小二乘法
        优化损失
            优化方法?
            正规方程
                天才 - 直接求解W
                拓展:
                1)
                    y = ax^2 + bx + c
                    y' = 2ax + b = 0
                    x = - b / 2a
                2)
                    a * b = 1
                        b = 1 / a = a ^ -1
                    A * B = E
                    [[1, 0, 0],
                    [0, 1, 0],
                    [0, 0, 1]]
                    B = A ^ -1

            梯度下降
                勤奋努力的普通人
                    试错、改进
        4.1.4 波士顿房价预测
            流程:
                1)获取数据集
                2)划分数据集
                3)特征工程:
                    无量纲化 - 标准化
                4)预估器流程
                    fit() --> 模型
                    coef_ intercept_
                5)模型评估
        回归的性能评估:
            均方误差
        4 正规方程和梯度下降对比

4.2 欠拟合与过拟合

训练集上表现得好,测试集上不好 - 过拟合
4.2.1 什么是过拟合与欠拟合
    欠拟合
        学习到数据的特征过少
        解决:
            增加数据的特征数量
    过拟合
        原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点
        解决:
            正则化
                L1
                损失函数 + λ惩罚项
                LASSO 权重的绝对值
                L2 更常用
                损失函数 + λ惩罚项 权重的平方

                正则化力度越大,权重系数会越小
                正则化力度越小,权重系数会越大

Ridge - 岭回归

4.3 线性回归的改进-岭回归

4.3.1 带有L2正则化的线性回归-岭回归
    alpha 正则化力度=惩罚项系数

4.4 分类算法-逻辑回归与二分类

4.4.1 逻辑回归的应用场景
    广告点击率 是否会被点击
    是否为垃圾邮件
    是否患病
    是否为金融诈骗
    是否为虚假账号
    正例 / 反例
4.4.2 逻辑回归的原理
    线型回归的输出 就是 逻辑回归 的 输入
    激活函数
        sigmoid函数 [0, 1]
        1/(1 + e^(-x))
    假设函数/线性模型
        1/(1 + e^(-(w1x1 + w2x2 + w3x3 + …… + wnxn + b)))
    损失函数
        (y_predict - y_true)平方和/总数
        逻辑回归的真实值/预测值 是否属于某个类别
        对数似然损失
        log 2 x
    优化损失
        梯度下降
4.4.4 案例:癌症分类预测-良/恶性乳腺癌肿瘤预测
    恶性 - 正例
    流程分析:
        1)获取数据
            读取的时候加上names
        2)数据处理
            处理缺失值
        3)数据集划分
        4)特征工程:
            无量纲化处理-标准化
        5)逻辑回归预估器
        6)模型评估
真的患癌症的,能够被检查出来的概率 - 召回率
4.4.5 分类的评估方法
    1 精确率与召回率
        1 混淆矩阵
            TP = True Possitive 真正例
            FN = False Negative 伪反例
            FP = False Negative 伪正例
            TN   True Possitive 真反例
        2 精确率(Precision)与召回率(Recall)
            精确率 预测为正,真的为正
            召回率 真正为正,预测为正的  查得全不全
            工厂 质量检测 次品 召回率
        3 F1-score 模型的稳健型   2TP/2TP + FN +FP =2*Precision*Recall/recision + Recall
   总共有100个人,如果99个样本癌症,1个样本非癌症 - 样本不均衡
   不管怎样我全都预测正例(默认癌症为正例) - 不负责任的模型
       准确率:99%
       召回率:99/99 = 100%
       精确率:99%
       F1-score: 2*99%/ 199% = 99.497%
       AUC:0.5
            TPR = 100%
            FPR = 1 / 1 = 100%
   2 ROC曲线与AUC指标
        1 知道TPR与FPR
            TPR = TP / (TP + FN) - 召回率
                所有真实类别为1的样本中,预测类别为1的比例
            FPR = FP / (FP + TN)
                所有真实类别为0的样本中,预测类别为1的比例

4.5 模型保存和加载

4.6 无监督学习-K-means算法

4.6.1 什么是无监督学习
    没有目标值 - 无监督学习
4.6.2 无监督学习包含算法
    聚类
    K-means(K均值聚类)
    降维
    PCA
4.6.3 K-means原理
4.6.5 案例:k-means对Instacart Market用户聚类
    k = 3
    流程分析:
    降维之后的数据
    1)预估器流程
    2)看结果
    3)模型评估
4.6.6 Kmeans性能评估指标
    轮廓系数
    如果b_i>>a_i:趋近于1效果越好,
    b_i<<a_i:趋近于-1,效果不好。
    轮廓系数的值是介于 [-1,1] ,
    越趋近于1代表内聚度和分离度都相对较优。
4.6.7 K-means总结
    应用场景:
        没有目标值
        分类

初步代码

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.metrics import mean_squared_error
import joblib


def linear1():
    """
    正规方程的优化方法对波士顿房价进行预测
    :return:
    """
    # 1)获取数据
    boston = load_boston()

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)

    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)预估器
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)

    # 5)得出模型
    print("正规方程-权重系数为:\n", estimator.coef_)
    print("正规方程-偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)

    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)

    error = mean_squared_error(y_test, y_predict)
    print("正规方程-均方误差为:\n", error)
    estimator.score(x_test,y_test)

    return None


def linear2():
    """
    梯度下降的优化方法对波士顿房价进行预测
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    print("特征数量:\n", boston.data.shape)

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)

    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # 4)预估器 learning_rate 学习率算法
    # eta0 学习率 loss 损失函数 最小二乘法
    # fit_intercept = True 是否偏置 penalty 正则化
    estimator = SGDRegressor(learning_rate="constant", eta0=0.01, max_iter=10000, penalty="l1")
    estimator.fit(x_train, y_train)

    # 5)得出模型
    print("梯度下降-权重系数为:\n", estimator.coef_)
    print("梯度下降-偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("梯度下降-均方误差为:\n", error)

    return None


def linear3():
    """
    对数似然损失法
    岭回归对波士顿房价进行预测
    Ridge方法相当于SGDRegressor(penalty='l2', loss="squared_loss"),只不过SGDRegressor实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG)
    :return:
    """
    # 1)获取数据
    boston = load_boston()
    print("特征数量:\n", boston.data.shape)

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)

    # 3)标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)

    # # 4)预估器
    # alpha: 正则化力度,也叫λ normalize=True 在未进行预处理时使用
    estimator = Ridge(alpha=0.5, max_iter=10000)
    # estimator.fit(x_train, y_train)
    #
    # # 保存模型
    # joblib.dump(estimator, "my_ridge.pkl")
    # 加载模型
    estimator = joblib.load("my_ridge.pkl")

    # 5)得出模型
    print("岭回归-权重系数为:\n", estimator.coef_)
    print("岭回归-偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("岭回归-均方误差为:\n", error)

    return None

if __name__ == "__main__":
    # 代码1:正规方程的优化方法对波士顿房价进行预测
    linear1()
    # 代码2:梯度下降的优化方法对波士顿房价进行预测
    linear2()
    # 代码3:岭回归对波士顿房价进行预测
    linear3()

癌症案例 逻辑回归和评估

import pandas as pd
import numpy as np

# 1、读取数据
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
column_name = ['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(path, names=column_name)

data.head()

# 2、缺失值处理
# 1)替换-》np.nan
data = data.replace(to_replace="?", value=np.nan)
# 2)删除缺失样本
data.dropna(inplace=True)

data.isnull().any() # 不存在缺失值

# 3、划分数据集
from sklearn.model_selection import train_test_split

data.head()

# 筛选特征值和目标值
x = data.iloc[:, 1:-1]
y = data["Class"]

x.head()

y.head()

x_train, x_test, y_train, y_test = train_test_split(x, y)

x_train.head()

# 4、标准化
from sklearn.preprocessing import StandardScaler

transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

x_train

from sklearn.linear_model import LogisticRegression

# 5、预估器流程
estimator = LogisticRegression()
estimator.fit(x_train, y_train)

# 逻辑回归的模型参数:回归系数和偏置
estimator.coef_

estimator.intercept_

# 6、模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)

# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

# 查看精确率、召回率、F1-score
from sklearn.metrics import classification_report

report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])

print(report)

y_test.head()

# y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
# 将y_test 转换成 0 1
y_true = np.where(y_test > 3, 1, 0)

y_true

from sklearn.metrics import roc_auc_score

roc_auc_score(y_true, y_predict)

案例 Kmeans 商品分类

# 1、获取数据
# 2、合并表
# 3、找到user_id和aisle之间的关系
# 4、PCA降维

import pandas as pd

# 1、获取数据
order_products = pd.read_csv("./instacart/order_products__prior.csv")
products = pd.read_csv("./instacart/products.csv")
orders = pd.read_csv("./instacart/orders.csv")
aisles = pd.read_csv("./instacart/aisles.csv")

# 2、合并表
# order_products__prior.csv:订单与商品信息

# 字段:order_id, product_id, add_to_cart_order, reordered
# products.csv:商品信息
# 字段:product_id, product_name, aisle_id, department_id
# orders.csv:用户的订单信息
# 字段:order_id,user_id,eval_set,order_number,….
# aisles.csv:商品所属具体物品类别
# 字段: aisle_id, aisle

# 合并aisles和products aisle和product_id
tab1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"])

tab2 = pd.merge(tab1, order_products, on=["product_id", "product_id"])

tab3 = pd.merge(tab2, orders, on=["order_id", "order_id"])

tab3.head()

# 3、找到user_id和aisle之间的关系
table = pd.crosstab(tab3["user_id"], tab3["aisle"])

data = table[:10000]

# 4、PCA降维
from sklearn.decomposition import PCA

# 1)实例化一个转换器类
transfer = PCA(n_components=0.95)

# 2)调用fit_transform
data_new = transfer.fit_transform(data)

data_new.shape

data_new

# 预估器流程
from sklearn.cluster import KMeans

estimator = KMeans(n_clusters=3)
estimator.fit(data_new)

y_predict = estimator.predict(data_new)

y_predict[:300]

# 模型评估-轮廓系数
from sklearn.metrics import silhouette_score

silhouette_score(data_new, y_predict)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348