- 模型保存
from sklearn.externals import joblib
# 模型保存
joblib.dump(model, "./tmp/test.pkl") #(模型对象,保存路径)
# 模型读取
model = joblib.load("./tmp/test.pkl")
回归:连续性数据
-
线性回归模型
通过特征的线性组合作为预测函数。-
损失函数
最小二乘法 -
系数矩阵w求解
-1- 正规方程 (sklearn.linear_model.LinearRegression)
缺点: 当特征数量多而复杂时,求解速度慢,复杂算法无法通过正规方程求解。from sklearn.datasets import load_boston from sklearn.linear_model import LinearRegression, SGDRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error def mylinear(): """ 线性回归直接预测房子价格 :return: None """ # 获取数据 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) x_test = std_x.transform(x_test) # 目标值 std_y = StandardScaler() y_train = std_y.fit_transform(y_train) y_test = std_y.transform(y_test) # estimator预测 # 正规方程求解方式预测结果 lr = LinearRegression() lr.fit(x_train, y_train) print(lr.coef_) # 预测测试集的房子价格 y_lr_predict = std_y.inverse_transform(lr.predict(x_test)) print("正规方程测试集里面每个房子的预测价格:", y_lr_predict) print("正规方程的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
-2- 梯度下降(sklearn.linear_model.SGDRegressor)
from sklearn.linear_model import SGDRegressor # 梯度下降去进行房价预测 sgd = SGDRegressor() sgd.fit(x_train, y_train) print(sgd.coef_) # 预测测试集的房子价格 y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test)) print("梯度下降测试集里面每个房子的预测价格:", y_sgd_predict) print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
-3- 两者比较
-
-
岭回归(sklearn.linear_model.Ridge)
带有l2正则化的最小二乘法线性回归,解决过拟合问题。from sklearn.linear_model import Ridge # 岭回归去进行房价预测 rd = Ridge(alpha=1.0) rd.fit(x_train, y_train) print(rd.coef_) # 预测测试集的房子价格 y_rd_predict = std_y.inverse_transform(rd.predict(x_test)) print("梯度下降测试集里面每个房子的预测价格:", y_rd_predict) print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))
-
逻辑回归 (sklearn.linear_model.LogisticRegression)
属于分类模型,将线性回归输入转化为分类结果(概率值)输出。在二分类问题中,概率值一般是指样本中类别占比较少的那一部分的概率。
sigmoid函数
对数似然损失函数
完整损失函数
from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler 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("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/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) #C为正则化lambda lg.fit(x_train, y_train) print(lg.coef_) y_predict = lg.predict(x_test) print("准确率:", lg.score(x_test, y_test)) print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])) return None
逻辑回归优缺点:
优点:可以得到的结果有概率解释;简单,速度快;参数代表各特征的影响,可解释性强;
缺点:不能处理多分类问题;属于线性分类器,难处理特征间相关的问题;特征空间较大时,性能不好;容易发生欠拟合。
-
欠拟合与过拟合
欠拟合:模型在训练集和测试集均不能获得好的预测结果,模型过于简单。
过拟合:模型在训练集获得很好的预测结果,但在测试集预测误差大,模型过于复杂。
-
欠拟合
原因: 模型学习到的数据特征太少
解决办法: 增加数据的特征数量 -
过拟合
原因: 原始特征过多,存在嘈杂特征,模型过度关注每个样本的特征。
解决办法: 特征选择,消除关联性大的特征;交叉验证;正则化。
-
-
判别模型与生成模型
根据是否需要先验概率划分为判别模型和生成模型,判别模型不需要,生成模型需要。先验概率为通过历史数据总结的概率信息。判别模型:k-近邻、决策树、神经网络等
生成模型:朴素贝叶斯、隐马尔可夫模型等
-
非监督学习算法
- 聚类算法(k-means算法)(sklearn.cluster.KMeans)
from sklearn.cluster import KMeans import matplotlib.pyplot as plt x = data[:500] # 假设分为四类 km = KMeans(n_cluster = 4) km.fit(x) predict = km.predict(x) # 显示聚类结果 plt.figure(figsize = (10,10)) # 建立四个颜色列表 colored = ['orange', 'green', 'blue', 'purple'] color = [colored[i] for i in predict] plt.scatter(x[:,1], x[:,2], color = color)
k-means性能评估 (sklearn.metrics.silhouette_score)
from sklearn.metrics import silhouette_score # 评判聚类效果-轮廓系数 silhouette_score(x, predict)
k-means优缺点:
优点: 迭代式算法,直观易懂,实用。
缺点: 收敛速度慢,时间复杂度高,容易收敛到局部最优解,需多次聚类;需要事先确定超参数k,对离群点和噪声敏感。