tips
- 1.线性回归
- 2.回归性能评估
- 3.过拟合与欠拟合
- 4.岭回归
- 5.模型的保存与加载
- 6.逻辑回归
- 7.分类性能评估
- 8.聚类算法-kmeans
- 9.聚类性能的评估
线性回归
- 利用回归方程对一个或者多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式
通用公式:
h(w)=w1x1+w2x2+w3x3+...+b=w^Tx + b
- 矩阵乘法:A(m,n)*B(n,l)=C(m,l)
因为预测的结果值和真实值是有误差的,怎么计算误差大小呢?
利用损失函数
- 最小二乘法
那怎么求每一个特征前的系数,使得损失值最小呢?
- 正规方程
- 天才,一步到位
- 梯度下降
- 勤奋的孩子,不断试错
- 试错的两个关键点:方向,步长
- 正规方程
API:
- 正规方程:
sklearn.linear_model.LinearRegression(fit_intercept=True)
- 梯度下降:
sklearn.linear_model.SGDRegressor(fit_intercept=True)
- 其中
- fit_intercept:是否计算偏置
- estimator.coef:回归系数
- estimator,intercept_:偏置
- 正规方程:
- 示例:
def linear1():
"""
用正规方程的优化方法的线性回归对波士顿房价进行预测
:return: None
"""
# 1、获取数据集
boston = load_boston()
# 2、划分数据集
# 获取数据集的特征值的形状
print(boston.data.shape)
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=6)
# 3、特征工程:标准化
# 1)实例化一个转换器类
transfer = StandardScaler()
# 2)调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、线性回归预估器流程
estimator = LinearRegression()
estimator.fit(x_train, y_train)
# 5、得出模型
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("正规方程优化方法的模型参数/权重系数/回归系数:\n", estimator.coef_)
print("偏置/截距:\n", estimator.intercept_)
回归性能评估
- 使用均方误差对线性回归算法进行性能评估
API:
sklearn.metrics.mean_squared_error(y_true, y_pred)
- 均方误差回归损失
- y_true:真实值
- y_pred:预测值
- return:浮点数结果
代码
error = mean_squared_error(y_test, y_predict)
print("正规方程的模型的均方误差为:\n", error)
- 总结:
- 简单易用
- 在不知道特征关系的前提下,使用线性回归作为大多数系统的首要选择
- 小规模数据,使用:linearRegression,因为它的计算量大,且不能解决拟合问题
- 大规模数据,使用SGDRegression
过拟合与欠拟合
- 过拟合:特征选择太多,训练模型过于复杂,导致测试数据的误差较大
- 解决办法:
- 进行特征选择,消除关联性大的特征(难做)
- 正则化:尽量减少高次项特征的影响
- L1正则化:使得w的元素为 0
- L2正则化:使得w的每个元素都很小,都接近于0
- 优点:越小的参数书名模型越简单,而越简单的模型越不容易产生过拟合的现象
- 解决办法:
- 欠拟合:特征选择太少,训练模型过于简单,导致测试数据的误差较大
- 解决办法:增加数据的特征数量
岭回归
- 带有L2正则化的线性回归算法
- 所以岭回归解决了线性回归不能解决的过拟合和欠拟合问题
API:
slearn.linear_model.Ridge(alpha=1.0)
- 具有l2正则化的线性最小二乘法
- alpha:正则化力度
- 正则化力度越大,权重系数越小
- 正则化力度越小,权重系数越大
- coef_:回归系数
示例:
def linear3():
"""
用岭回归对波士顿房价进行预测
:return: None
"""
# 1、获取数据集
boston = load_boston()
# 2、划分数据集
# 获取数据集的特征值的形状
print(boston.data.shape)
x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=6)
# 3、特征工程:标准化
# 1)实例化一个转换器类
transfer = StandardScaler()
# 2)调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、线性回归预估器流程
estimator = Ridge()
estimator.fit(x_train, y_train)
# 5、得出模型
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("岭回归优化方法的模型参数/权重系数/回归系数:\n", estimator.coef_)
print("偏置/截距:\n", estimator.intercept_)
# 6、性能评估——均方误差
error = mean_squared_error(y_test, y_predict)
print("岭回归的模型的均方误差为:\n", error)
return None
- 总结:
- 跟线性回归相比,岭回归得到的回归系数更符合实际,更可靠。
- 让估计参数的波动范围变小,变得更稳定
- 在存在病态数据偏多的研究中有较大的使用价值
模型的保存与加载
- 导入joblib模块:
from sklearn.externals import joblib
- 保存:
joblib.dump(预估器,'保存的路径.pkl')
- 注意,文件类型是.pkl
- 加载:
joblib.load('文件路径')
逻辑回归
- 解决二分类问题的分类算法
- 如,是否患有癌症,是否点击,等
- 逻辑回归是将线性回归的输出作为输入
- 然后经过sigmoid函数的计算,计算的结果是一个概率值,通过概率的大小来判断是否属于两个类别中的一个
评判逻辑回归计算结果的误差大小也使用损失函数
- 因为是分类问题,逻辑回归的损失函数跟线性回归的不同
- 对数似然损失函数
- cost损失的值越小,那么预测的类别准确度越高
优化损失
- 使用梯度下降的方法
API:
sklearn.linear_model.LogisticRegression(penalty='l2',C=1.0)
- Logistic回归分类器
- coef_:回归系数
示例:
def logistic_cancer():
"""
用逻辑回归对癌症进行预测
:return: None
"""
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
# 1、获取数据集
column_name = ['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']
cancer = pd.read_csv(path, names=column_name)
# 2、基本的数据处理,特征值和目标值
# 处理缺失值
cancer = cancer.replace(to_replace="?", value=np.nan)
cancer = cancer.dropna()
# 拿到特征值和目标值
x = cancer[['Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion',
'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin', 'Normal Nucleoli', 'Mitoses']]
y = cancer["Class"]
# 3、划分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=6)
# 4、特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5、逻辑回归预估器流程
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
print("模型参数为:\n", estimator.coef_)
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
# 6、模型评估
# 直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
# 精确率和召回率
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
print("精确率和召回率report:\n", report)
# ROC曲线和AUC指标
y_true = np.where(y_test > 2.5, 1, 0)
print("y_true:\n", y_true)
auc = roc_auc_score(y_true, y_predict)
print("roc_auc_score:\n", auc)
return None
- 总结
- 优点:适合需要得到一个分类概率的场景,简单,速度快
- 缺点:不好处理多分类问题
- 使用场景:广告点击率预测,是否患病,是否为金融诈骗,是否为虚假账号
分类性能评估
- 直接计算准确率L
estimator.score()
- 精确率和召回率
- 精确率:预测结果为正例样本中真实为正例的比例
- 召回率:真实为正例的样本中预测结果为正例的比例
- 是否查的全,对正样本的区别能力
ROC曲线与AUC指标
为什么要使用召回率等评估方式
- 因为很多场景不一定只关心预测的准确率,如癌症预测的例子。跟预测的准确率相比,更关心的是在所有的样本中,癌症患者有没有被全部检测出来
API:
sklearn.metrics.classification_report(y_true,y_pred,labels=None, target_names=None)
- y_true:真实目标值
- y_pred:估计器预测目标值
- labels:目标值
- target_names:目标类别名称
- return:每隔类别精确率与召回率
示例:
# 精确率和召回率
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
print("精确率和召回率report:\n", report)
如何衡量样本不均衡下的评估
- ROC曲线与AUC指标
- TRP = TP/(TP+FN)
- 所有真实类别为1的样本中,预测类别为1的比例
- FPR = FP/(FP+FN)
- 所有真实类别为0的样本中,预测类别为1的比例
- ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义则是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的,此时AUC为0.5
- AUC就是正确区分出正例样本的能力
- TRP = TP/(TP+FN)
API:
sklearn.metrics.roc_auc_score(y_true,y_score)
- 计算ROC曲线面积,即AUC值
- y_true:每个样本的真实类别,必须为0(假例),1(正例)标记
- y_score:预测得分,可以是正例的估计概率,置信值或者分类器方法的返回值
特点:
- AUC只能用来评价二分类
- AUC非常适合评价样本不平衡中的分类器性能
- ROC曲线与AUC指标
聚类算法:K-means
- 对没有目标值的特征值进行分类的算法
也就是无监督学习,无监督学习包括
- 聚类
- K-means(K均值聚类)
- 降维
- PCA
- 聚类
API:
sklearn.cluster.KMeans(n_clusters=8,init='k-means++')
- k-means聚类
- n_clusters:开始的聚类中心数量
- init:初始化方法,默认为‘k-means++’
示例:
1.降维之后的数据
2.k-means预估器流程
3.得出聚类结果
聚类性能的评估
API:
sklearn.metrics.silhouette_score(X,labels)
- 计算所有样本的平均轮廓系数
- x:特征值
- labels:被聚类标记的目标值
k-means总结
- 优点:采用迭代式算法,直观易懂且实用
- 缺点:容易收敛到局部最优解