机器学习-DAY09

1.sklean模型的保存和加载

from sklearn.externals import joblib

2.逻辑回归算法

线性回归的式子作为逻辑回归的输入

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

 

y=g(z),阈值为0.5,当g(z)在【0,0.5】之间y=0,当g(z)在【0.5,1】之间y=1

 

 

 

损失函数:均方误差(不存在多个局部最低点)只有一个最小值

对数似然估计:多个局部最小值(目前解决不了的问题)

        解决方案:1.随机初始化,多次比较最小值结果

                           2.求解过程中,调整学习率

                           只能尽量改善,尽管没有全局最低点,效果依然不错

3.逻辑回归损失函数调整及优化

 

# import matplotlib.pyplot as plt
#
# plt.figure(figsize=(10,10))
# plt.scatter([60,72,75,80,83], [126,151.2,157.5,168,174.3])
# plt.show()

from sklearn.datasets import load_boston  # 加载波士顿房价数据
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression   # 回归预测时使用的API:正规方程/梯度下降/岭回归/逻辑回归
from sklearn.model_selection import train_test_split   # 数据分割
from sklearn.preprocessing import StandardScaler   # 标准化
from sklearn.metrics import mean_squared_error,classification_report   # 线性回归性能评估/召回率
from sklearn.externals import joblib   # 模型的保存与读取
import numpy as np
import pandas as pd
import numpy as np

def mylinear():
    """
    线性回归直接预测房子价格
    :return:
    """
    # 获取数据
    lb = load_boston()

    # 分隔数据集到训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train, y_test)
    # 进行标准化处理
    # 特征值和目标值都进行标准化处理,目标值还需再转换回来,实例化两个标准化API
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train.reshape(-1, 1))  # x_train.reshape(-1, 1) 把一维数据改成二维
    x_test = std_x.transform(x_test.reshape(-1, 1))

    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))

    print(x_train.shape)
    print(y_train.shape)

    # estimator预测
    # 正规方程求解方式预测结果
    lr = LinearRegression()
    lr.fit(x_train[0:379], y_train)   # 该处与视频不同,必须保持fit两个参数长度一致,这是数据量过少导致的
    print("lr权重参数:", lr.coef_)    # 打印权重参数

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

    # 预测模型读取
    model =joblib.load("./temp/test.pkl")
    model_predict = std_y.inverse_transform(model.predict(x_test))
    print("保存的模型预测的结果:", model_predict)

    # # 预测测试集的房子价格
    # y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
    # print("lr测试集中每个房子的预测价格:", y_lr_predict)
    # print("正规方程的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict[0:127]))
    #
    # # 梯度下降进行房价预测
    # sgd = SGDRegressor()
    # sgd.fit(x_train[0:379], y_train)   # 该处与视频不同,必须保持fit两个参数长度一致
    # print("sgd权重参数:", sgd.coef_)    # 打印权重参数
    #
    # # 预测测试集的房子价格
    # y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
    # print("sgd测试集中每个房子的预测价格:", y_sgd_predict)
    # print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict[0:127]))
    #
    # # 岭回归进行房价预测
    # rd = Ridge(alpha=1.0)   #  alpha可以在0-1之间,或者1-10之间
    # rd.fit(x_train[0:379], y_train)   # 该处与视频不同,必须保持fit两个参数长度一致
    # print("Ridge权重参数:", rd.coef_)    # 打印权重参数
    # # 预测测试集的房子价格
    # y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
    # print("Ridge测试集中每个房子的预测价格:", y_rd_predict)
    # print("岭回归的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict[0:127]))

    return None

def logistic():
    """
    逻辑回归做二分类进行癌症预测(根据细胞的属性特征)
    :return: 
    """
    # 构造列标签名字
    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("D:/temp/breast-cancer-wisconsin.data", names=column)
    print(data)

    # 缺失值进行处理
    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)
    # 逻辑回归预测
    lg = LogisticRegression(C=1.0)
    lg.fit(x_train, y_train)
    y_predict = lg.predict(x_test)
    print("lg权重参数:", lg.coef_)
    print("逻辑回归的准确性:", lg.score(x_test, y_test))
    print("逻辑回归的召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"]))

    return None

if __name__ == "__main__":
    logistic()

 4.逻辑回归肿瘤检测案例

 当读取数据时,没有列的名字,会默认把第一行作为列名

原始数据下载链接:

https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data

数据描述:

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

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

 逻辑回归一般解决二分类问题,使用softmax方法可以满足逻辑回归下的多分类问题

生成模型有先验概率,判别模型没有先验概率

 5.k-means原理以及案例

无监督学习

 

 聚类在分类之前

聚类评估标准(轮廓系数):

 每一个样本都有一个轮廓系数,轮廓系数在【-1,1】区间,越靠近1越好

Kmeans评估API: 

 Kmeans总结:

        特点分析:采用迭代算法,直观易懂并且非常实用

        缺点:容易收敛到局部最优解(多次聚类)

        注意:聚类一般做在分类之前

# 聚类做在分类之前
from sklearn.decomposition import PCA   # pca主成分分析
from sklearn.cluster import KMeans   # k-means聚类
import matplotlib.pyplot as plt    # 画出数据
from sklearn.metrics import silhouette_score   # Kmeans聚类评估
import pandas as pd

# 读取数据
prior = pd.read_csv("./data/……文件1路径")
products = pd.read_csv("./data/……文件2路径")
orders = pd.read_csv("./data/……文件3路径")
aisles = pd.read_csv("./data/……文件4路径")
# 合并四张表到一张表(用户-物品类别)
_mg = pd.merge(prior,products,on=['product_id', 'product_id'])
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
mt = pd.merge(_mg,aisles,on=['aisle_id','aisle_id'])

# 数据查看(前10个)
mt.head(10)

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

# 打印交叉表前十个数据
cross.head(10)

# 进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
# 显示数据形状
sh = data.shape
print(sh)

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

# 假设用户一共分为四个类别
km = KMeans(n_clusters=4)  # 已知把数据分成4类
km.fit(x)
predict = km.predict(x)

# 画出数据点
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)   # 选取x的第一个和第20个特征点画图
plt.xlabel("1")
plt.ylabel("20")
plt.show()

# 评估聚类效果,轮廓系数
k_score = silhouette_score(x, predict)
print("Kmeans聚类评估:", k_score)   #一般聚类效果很难超过0.7,很多数据聚类效果在0.1-0.2之间震荡

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值