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