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之间震荡