机器学习(3、逻辑回归 4、决策树)

1.逻辑回归

1.1 逻辑回归是机器学习中的一种分类模型

  • 激活函数
    • sigmoid函数
    • 逻辑回归结果[0,1]
    • 二分类
      • 大于阀值————>正例
      • 小于阀值————>负例
  1. 损失及优化
  • 逻辑回归的损失,称为对数似然损失
  • 逻辑回归api
  • sklearn.linear_model.LogisticRegression(solver=‘liblinear’, penalty=‘l2’, C = 1.0)
    • solver可选参数:{‘liblinear’, ‘sag’, ‘saga’,‘newton-cg’, ‘lbfgs’},
      • 默认: ‘liblinear’;用于优化问题的算法。
      • 对于小数据集来说,“liblinear”是个不错的选择,而“sag”和’saga’对于大型数据集会更快。
      • 对于多类问题,只有’newton-cg’, ‘sag’, 'saga’和’lbfgs’可以处理多项损失;“liblinear”仅限于“one-versus-rest”分类。
    • penalty:正则化的种类
    • C:正则化力度
  • 案例:癌症分类预测-良/恶性乳腺癌肿瘤预测
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

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

# 1.获取数据
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']

data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
                  names=names)
data.head()

# 2.基本数据处理
# 2.1 缺失值处理
data = data.replace(to_replace="?", value=np.NaN)
data = data.dropna()
# 2.2 确定特征值,目标值
x = data.iloc[:, 1:10]
x.head()
y = data["Class"]
y.head()
# 2.3 分割数据
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 3.特征工程(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4.机器学习(逻辑回归)
estimator = LogisticRegression()
estimator.fit(x_train, y_train)

# 5.模型评估
y_predict = estimator.predict(x_test)
y_predict
estimator.score(x_test, y_test)
  • 分类评估方法
  • 混淆矩阵
    • 在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)
  • 准确率
    • (TP+TN)/(TP+TN+FN+FP)
  • 精确率(Precision)
    • TP/(TP+FP)
    • 预测结果正例样本中真实为正例的比例
  • 召回率(Recall)
    • TP/(TP+FN)
    • 真实为正例的样本中预测结果为正例的比例
  • F1-score:反映了模型的稳健型
  • 分类评估报告api
    • sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
      • y_true:真实目标值
      • y_pred:估计器预测目标值
      • labels:指定类别对应的数字
      • target_names:目标类别名称
      • return:每个类别精确率与召回率
ret = classification_report(y_test, y_predict, labels=(2,4), target_names=("良性", "恶性"))
print(ret)
  • ROC曲线
    • TPR = TP / (TP + FN)
      所有真实类别为1的样本中,预测类别为1的比例
    • FPR = FP / (FP + TN)
      所有真实类别为0的样本中,预测类别为1的比例
  • AUC指标
    • 越接近1,效果越好
    • 越接近0,效果越差
    • 越接近0.5,效果就是胡说
    • 这个指标主要用于评价不平衡的二分类问题
  • ROC曲线的绘制
    • 1.构建模型,把模型的概率值从大到小进行排序
    • 2.从概率最大的点开始取值,一直进行tpr和fpr的计算,然后构建整体模型,得到结果
    • 3.其实就是在求解积分(面积)

决策树

  • 决策树(if-else)
    • 一个树形结构
    • 每个非叶子节点代表一个判断
    • 叶子节点代表的是一个分类结果
  • 决策树分类原理
  • 熵 Entropy 是“混乱”程度的量度
  • 系统越有序,熵值越低;系统越混乱或者分散,熵值越高
  • 信息理论:
    • 1.从信息的完整性上进行的描述:当系统的有序状态一致时,数据越集中的地方熵值越小,数据越分散的地方熵值越大。
    • 2.从信息的有序性上进行的描述:
      当数据量一致时,系统越有序,熵值越低;系统越混乱或者分散,熵值越高
  • 信息熵” (information entropy)是度量样本集合纯度最常用的一种指标
  • 决策树的分类依据有且只有三个
    • 1、信息增益ID3

      • 信息增益 = entroy(前) - entroy(后)
      • 根据条件划分决策树熵值差衡量样本划分效果好坏
      • 信息增益越大越好
      • 选择信息增益大的作为第一决策依据
      • 信息增益准则对可取值数目较多的属性有所偏好
    • 2、信息增益率C4.5

      • 选择信息增益大的作为第一决策依据
      • while(当前节点"不纯"):
        • 1.计算当前节点的类别熵(以类别取值计算)
        • 2.计算当前阶段的属性熵(按照属性取值吓得类别取值计算)
        • 3.计算信息增益
        • 4.计算各个属性的分裂信息度量
        • 5.计算各个属性的信息增益率
      • end while
      • 当前阶段设置为叶子节点
    • 3、基尼值和基尼指数CART

      • 二叉树
      • 基尼值Gini(D)
        • 表示类别不一致的概率
        • 值越小越好,值越小纯度越高
      • 基尼指数Gini_index(D)
        • while(当前节点不纯)—基尼值不为0 1.遍历每个变量的每一种分割方式,找到最好的分割点----基尼指数值小
        • 2.分割成两个节点N1和N2
          每个节点足够“纯”为止
  • 常见决策树的启发函数比较
  • 信息增益(ID3 算法)
  • 缺点:
    • 倾向于选择取值较多的属性
    • 只对离散型属性的数据集构造决策树
  • 信息增益率(C4.5算法)
  1. 用信息增益率来选择属性
  2. 可以处理连续数值型属性
  3. 采用了一种后剪枝方法
  4. 对于缺失值的处理
    C4.5算法的优缺点

​ 优点:

​ 产生的分类规则易于理解,准确率较高。

​ 缺点:算法低效

​ 在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

​ C4.5只适合于能够驻留于内存的数据集(后减枝)

  • CART算法
  1. 二叉树
  2. 处理离散型.连续型特征
  3. C4.5不一定是二叉树,但CART一定是二叉树
决策树变量的两种类型:
  1. 数字型 连续型 年收入
  2. 名称型 离散型 类别型 婚姻状况
如何评估分割点的好坏
  • 找到能让数据最快达到"纯"的分割点就是好

cart剪枝

随着判断节点的增加 训练集效果越好越好

​ 测试集效果 先上升后下降

存在过拟合现象

出现这种情况的原因

原因1:噪声、样本冲突,即错误的样本数据。

原因2:特征即属性不能完全作为分类标准。

原因3:巧合的规律性,数据量不够大。

常用的减枝方法
  1. 预减枝

    1. 指定每一个结点所包含的最小样本数目,
    2. 指定高度或深度
    3. 指定一个阈值 ,熵小于阈值 就不往下划分
  2. 后减枝

    后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。

工作:后减枝

特征工程-特征提取

  • 将任意数据(如文本或图像)转换为可用于机器学习的数字特征

  • 特征提取分类:

    • 字典特征提取(特征离散化)
    • 文本特征提取
    • 图像特征提取(深度学习)
  • 特征提取API

    • sklearn.feature_extraction
  • 字典特征提取
    -作用:对字典数据进行特征值化

    • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
      • DictVectorizer.fit_transform(X)
        • X:字典或者包含字典的迭代器返回值
        • 返回sparse矩阵
    • DictVectorizer.get_feature_names() 返回类别名称
#[{'city': '北京','temperature':100},
#{'city': '上海','temperature':60},
#{'city': '深圳','temperature':30}]
#流程分析
#实例化类DictVectorizer
#调用fit_transform方法输入数据并转换(注意返回格式)
from sklearn.feature_extraction import DictVectorizer

def dict_demo():
    """
    对字典类型的数据进行特征抽取
    :return: None
    """
    data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer(sparse=False)
    # 2、调用fit_transform
    data = transfer.fit_transform(data)
    print("返回的结果:\n", data)
    # 打印特征名字
    print("特征名字:\n", transfer.get_feature_names())

    return None


没有加上sparse=False参数的结果:
   (0, 1)    1.0
  (0, 3)    100.0
  (1, 0)    1.0
  (1, 3)    60.0
  (2, 2)    1.0
  (2, 3)    30.0
#特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']
加参数后得到返回的结果:
 [[   0.    1.    0.  100.]
 [   1.    0.    0.   60.]
 [   0.    0.    1.   30.]]
特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']
  • 文本特征提取
  • 作用:对文本数据进行特征值化
  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
    • 返回词频矩阵
    • CountVectorizer.fit_transform(X)
      • X:文本或者包含文本字符串的可迭代对象
      • 返回值:返回sparse矩阵
    • CountVectorizer.get_feature_names() 返回值:单词列表
  • sklearn.feature_extraction.text.TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer

def text_count_demo():
    """
    对文本进行特征抽取,countvetorizer
    :return: None
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 1、实例化一个转换器类
    # transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data = transfer.fit_transform(data)
    print("文本特征抽取的结果:\n", data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names())

    return None
返回结果:
文本特征抽取的结果:
 [[0 1 1 2 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
返回特征名字:
 ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
  • jieba分词处理
  • jieba.cut()
    • 返回词语组成的生成器
    • pip3 install jieba
案例:
今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。

我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。

如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
分析:
准备句子,利用jieba.cut进行分词
实例化CountVectorizer
将分词结果变成字符串当作fit_transform的输入值

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):
    """
    对中文进行分词
    "我爱北京天安门"————>"我 爱 北京 天安门"
    :param text:
    :return: text
    """
    # 用结巴对中文字符串进行分词
    text = " ".join(list(jieba.cut(text)))

    return text

def text_chinese_count_demo2():
    """
    对中文进行特征抽取
    :return: None
    """
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    # 将原始数据转换成分好词的形式
    text_list = []
    for sent in data:
        text_list.append(cut_word(sent))
    print(text_list)

    # 1、实例化一个转换器类
    # transfer = CountVectorizer(sparse=False)
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data = transfer.fit_transform(text_list)
    print("文本特征抽取的结果:\n", data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names())

    return None
返回结果:
Building prefix dict from the default dictionary ...
Dumping model to file cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cache
Loading model cost 1.032 seconds.
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']
Prefix dict has been built succesfully.
文本特征抽取的结果:
 [[2 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1 0]
 [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0 1]
 [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0 0]]
返回特征名字:
 ['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']
  • Tf-idf文本特征提取
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
      • api:sklearn.feature_extraction.text.TfidfVectorizer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值