一、逻辑回归

1、逻辑回归

应用:用于二分类问题,能得出概率值。

  • 广告点击率
  • 是否为垃圾邮件
  • 是否患病
  • 金融诈骗
  • 虚假账号
  • 判断用户性别
  • 评论正面负面
  • 用户是否会购买

输入与线性回归相同:(单个样本)

 

Sigmoid函数:能够将输入转化为0-1之间的一个值(转化为一个分类问题)

 

 逻辑回归公式:

输出:[0,1]区间的概率值,默认0.5作为阀值

注:g(z)为sigmoid函数,z表示线性回归的结果

 

2、逻辑回归的损失函数

与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降更新权重

对数似然损失函数

y代表回归结果属于0或1

当y=1时:

当y=0时:

完整的损失函数:

 

所有样本损失值乘以0/1后的差求和(类似于信息熵的求法)

cost损失的值越小,那么预测的类别准确度更高。

 

损失函数比较:

均方误差:不存在多个局部级低点,只有一个最小值。

对数似然损失:有多个局部最小值(两个改善方式:① 多次随机初始化,多次比较最小值结果。② 求解过程中调整学习率 )

3、API与案例分析

sklearn.linear_model.LogisticRegression

sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)

  • penalty与C设置正则化
  • Logistic回归分类器
  • coef_:回归系数

良/恶性乳腺癌肿瘤预测

数据集:https://archive.ics.uci.edu/ml/machine-learning-databases/

breast-cancer-wisconsin.names 查看说明

breast-cancer-wisconsin.data

数据描述:

(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤相关的医学特征,最后一列表示肿瘤类型的数值。

(2)包含16个缺失值,用”?”标出。

恶性类别的数量少,所以判定恶性的概率值。

分类流程:

① 获取数据

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

③ 估计器流程

 

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():返回数据

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


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("./data/breast-cancer-wisconsin.data", names=column)
    # 处理缺失值:替换后用平均值填充或删除
    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)
    # 逻辑回归预测
    lr = LogisticRegression()
    lr.fit(x_train, y_train)
    print(lr.coef_)  # 权重参数
    print("准确率:", lr.score(x_test, y_test))
    print("召回率:", classification_report(y_test, lr.predict(x_test), labels=[2,4], target_names=['良性', '恶性']))

    return None

if __name__ == '__main__':
    logistic()

 其他案例:上下文广告点击 https://www.kaggle.com/c/avito-context-ad-clicks

 

小结

优点:适合需要得到一个分类概率的场景

缺点:

  • 当特征空间很大时,逻辑回归的性能不是很好(看硬件能力)
  • 不能做多分类问题

朴素贝叶斯有先验概率,属于生成模型;逻辑回归是判别模型;

 

4、多分类问题

逻辑回归解决办法:1V1,1Vall

softmax方法:逻辑回归在多分类问题上的推广(详见神经网络部分)

二、k-means

1、非监督学习

非监督学习的特点:物以类聚,人以群分

 

 k-means步骤:

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

 

 

 

 

 

 2、k-means API与案例

sklearn.cluster.KMeans

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)

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

聚类一般做在分类之前。

不知道类别的个数就作为超参数。

 

k-means对Instacart Market用户聚类

  • 数据降维
  • k-means聚类
  • 聚类结果显示
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 读取四张表的数据
prior = pd.read_csv("./data/instacart/order_products_prior.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
products = pd.read_csv("./data/instacart/products.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'])
meg = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])
# print(meg.head(10))

# 交叉表
cross = pd.crosstab(meg['user_id'], meg['aisle'])
# print(cross.head(100))

# 进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)

# 为了节省时间把样本数量减少
x = data[:500]
print(x.shape)

# 假设用户一共分为四个类别
# k-means聚类
km = KMeans(n_clusters=4)
km.fit(x)
predict = km.predict(x)
print(predict)
# 显示聚类的结果
plt.figure(figsize=(10, 10))
color = ['orange', 'green', 'blue', 'purple']
cor = [color[i] for i in predict]
plt.scatter(x[:, 1], x[:, 20], color=cor)
plt.xlabel("特征1")
plt.ylabel("特征20")
plt.show()

 

 

3、性能评估

Kmeans性能评估指标:轮廓系数

注:对于每个点𝑖 为已聚类数据中的样本 ,𝑏𝑖 为𝑖 到其它族群的各个类别样本的平均距离的最小值,𝑎𝑖 为𝑖 到本身簇的距离平均值。

最终计算出所有的样本点的轮廓系数平均值

如果 𝑠𝑐𝑖 小于0,说明𝑎𝑖 的平均距离大于最近的其他簇。聚类效果不好

如果 𝑠𝑐𝑖  越大,说明𝑎𝑖  的平均距离小于最近的其他簇(一般0.1以上就很好了)。聚类效果好

轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优,越趋于-1聚类效果越差

# 评估聚类效果:轮廓系数
print(silhouette_score(x, predict))

 

 

小结

优点

  • 采用迭代式算法,直观易懂并且非常实用

缺点

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

 

posted on 2020-02-06 22:05  三分天涯  阅读(879)  评论(0编辑  收藏  举报