一、逻辑回归
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++解决)