机器学习算法基础 6 模型保存与加载、逻辑回归、Kmeans(聚类)

模型的保存与加载

# sklearn模型的保存与加载
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
from sklearn.metrics import mean_squared_error
import joblib

# 一、获得数据
lb = load_boston()

# 二、处理数据

# 1.取得数据集中特征值与目标值
x = lb.data
y = lb.target

# 2.分割数据集  训练集与测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

# 三、进行特征工程
# 1.训练集与测试集标准化处理
# 特征值与目标值都必须进行标准化处理,实例化两个API,分别处理特征值与目标值
# 特征值
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)

# 目标值
std_y = StandardScaler()
# 要求传入的y_train是二维数组,后面也一样,用reshape(-1,1)方法转换
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))

# 1.正规方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train, y_train)
# 回归系数
print('正规方程的回归系数为:\n', lr.coef_)

# 预测测试集房子的价格,
y_predict = std_y.inverse_transform(lr.predict(x_test))
print('正规方程预测测试集房子的价格:\n', y_predict)
# 回归性能评估
y_test = std_y.inverse_transform(y_test)
print('正规方程的回归性能评估为:', mean_squared_error(y_test, y_predict))

# 保存训练好的模型
joblib.dump(lr, 'test.pkl')

# 模型加载预测房价结果
model = joblib.load('test.pkl')
# 预测测试集房子价格
y_model_predict = std_y.inverse_transform(model.predict(x_test))
print('保存模型预测房价结果\n', y_model_predict)

分类算法

逻辑回归(监督学习)

逻辑回归是解决二分类问题的利器

案例

  1. 广告点击率
  2. 判断用户的性别
  3. 预测用户是否会购买给定的商品类
  4. 判断一条评论是正面的还是负面的

机器学习算法基础 6 模型保存与加载、逻辑回归、Kmeans(聚类)_第1张图片

拟合函数

h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x h_\theta(x) = g(\theta^Tx) = \frac{1}{1 + e^{-\theta^Tx}} hθ(x)=g(θTx)=1+eθTx1

其中 sigmoid 函数为:
g ( z ) = 1 1 + e − z g(z) = \frac{1}{1 + e^{-z}} g(z)=1+ez1

机器学习算法基础 6 模型保存与加载、逻辑回归、Kmeans(聚类)_第2张图片

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

损失函数

https://blog.csdn.net/bitcarmanlee/article/details/51165444

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

对数似然损失函数cost function:

c o s t ( h 0 ( x ) , y ) = { − l o g ( h θ ( x ) ) if  y = 1 − l o g ( 1 − h θ ( x ) ) if  y = 0 cost(h_0(x), y) = \begin{cases} −log(h_θ(x)) &\text{if } y=1 \\ −log(1 - h_θ(x)) &\text{if } y=0 \end{cases} cost(h0(x),y)={log(hθ(x))log(1hθ(x))if y=1if y=0

将以上两个表达式合并为一个,则单个样本的损失函数可以描述为:

c o s t ( h θ ( x ) , y ) = − y i l o g ( h θ ( x ) ) − ( 1 − y i ) l o g ( 1 − h θ ( x ) ) cost(h_θ(x),y)=−y_ilog(h_θ(x))−(1−y_i)log(1−h_θ(x)) cost(hθ(x),y)=yilog(hθ(x))(1yi)log(1hθ(x))

因为 y i y_i yi 只有两种取值情况,1或0,分别令 y = 1 y=1 y=1 y = 0 y=0 y=0,即可得到原来的分段表示式。
全体 m m m 个样本的损失函数可以表示为:

c o s t ( h θ ( x ) , y ) = ∑ i = 1 m − y i l o g ( h θ ( x ) ) − ( 1 − y i ) l o g ( 1 − h θ ( x ) ) cost(h_θ(x),y)= \displaystyle\sum_{i=1}^m −y_ilog(h_θ(x))−(1−y_i)log(1−h_θ(x)) cost(hθ(x),y)=i=1myilog(hθ(x))(1yi)log(1hθ(x))

和信息熵的关系

信息熵越小越好,损失越小,越确定

损失函数对比

均方误差:不存在多个局部最低点,只存在一个最小值
对数似然函数:多个局部最小值(这个目前解决不了)—梯度下降法特点

优化方向

https://www.cnblogs.com/yuyingblogs/p/15310959.html

  1. 多次随机初始化,多次比较最小值结果
  2. 求解过程当中,调整学习率

在这里插入图片描述

逻辑回归案例

样本比例:良性(65.5%) 恶性(34.5%)

根据样本数量大小判定,哪个类别少,判定概率值是指这个类型。本案例为恶性(正例),
即概率为0.6则为恶性,概率为0.1则为良性

# 逻辑回归做二分类进行癌症预测
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

# 一、读取数据
# 构造列标签列表
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']

# names参数指定列名
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',
                   names=column_names)
print(data)

# 二、数据处理
# 1.缺失值进行处理-替代
data = data.replace(to_replace='?', value=np.nan)

# 删除
data = data.dropna()

# 2.取特征值与目标值
y = data[column_names[10]]
x = data[column_names[1:10]]

# 3.数据集分割-训练集与测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

# 三、特征工程
# 1.标准化处理
std = StandardScaler()

# 特征值进行标准化
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)

# 四、逻辑回归预测
# 正则化系数C是超参数,可以调优
lg = LogisticRegression(C=1.0)
lg.fit(x_train, y_train)

# 回归系数
print('回归系数:\n', lg.coef_)

# 预测准确率
print('准确率:\n', lg.score(x_test, y_test))

# 每个类别的精确率与召回率
y_predict = lg.predict(x_test)
print('每个类别的精确率与召回率是:\n', classification_report(

    # 2与良性对应,4与恶性对应
    y_test, y_predict, labels=[2, 4], target_names=['良性', '恶性']))

k-means-聚类-(非监督学习)

机器学习算法基础 6 模型保存与加载、逻辑回归、Kmeans(聚类)_第3张图片

k-means步骤

k-means步骤:

  1. 随机设置K个特征空间内的点作为初始的聚类中心
  2. 对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
  3. 接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
  4. 如果计算得出的新中心点与原中心点一样,那么结束聚类;
    否则根据新的中心点重复第二步操作

其中,K:把数据划分成多少个类别
若不知道类别个数-超参数

性能评估指标

轮廓系数:

  1. 计算蓝1到自身类别的点距离的平均值 a i a_i ai
  2. 计算蓝1到红色类别、绿色类别所有的点的距离,求出平均值 b 1 b_1 b1 b 2 b_2 b2、,取其中最小的值当作 b i b_i bi
  3. a i > > b i a_i>>b_i ai>>bi 不好; a i < < b i a_i<ai<<bi

机器学习算法基础 6 模型保存与加载、逻辑回归、Kmeans(聚类)_第4张图片

解释:

  1. 如果 s c i sc_i sci 小于0: 说明 a i a_i ai 的平均距离大于最近的其他簇。聚类效果不好
  2. 如果 s c i sc_i sci 越大说明 a i a_i ai 的平均距离小于最近的其他簇。聚类效果好
    轮廓系数的值是介于 [ − 1 , 1 ] [-1, 1] [1,1] ,越趋近于1代表内聚度和分离度都相对较优

案例

用户对物品种类喜好分析

import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score

# 读取四张表的数据
prior = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")

# 合并四张表到一张表  (用户-物品类别)
_mg = pd.merge(prior, products, on=['product_id', 'product_id'])
print(_mg)
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])
print(mt)

# 交叉表(特殊的分组工具)
cross = pd.crosstab(mt['user_id'], mt['aisle'])

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

# 把样本数量减少
x = data[:500]
print(x.shape)

# 假设用户一共分为四个类别
km = KMeans(n_clusters=4)
km.fit(x)

predict = km.predict(x)
print(predict)

# 绘制聚类的结果
plt.figure(figsize=(10,10))

# 建立四个颜色的列表
colored = ['orange', 'green', 'blue', 'purple']
colr = [colored[i] for i in predict]
plt.scatter(x[:, 1], x[:, 20], color=colr)
plt.xlabel("1")
plt.ylabel("20")
plt.show()

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

你可能感兴趣的:(算法,聚类)