1.回归算法-线性回归分析
回归:目标值连续
线性回归需要做标准化处理。
线性关系模型
一个通过属性的线性组合来进行预测的函数:
w为权重(斜率),b为偏置项(截距)
损失函数(误差大小)
- yi为第i个训练样本的真实值
- hw(xi)为第i个样本特征值组合预测函数
总损失定义:
又称最小二乘法
优化W,减少损失的方法
1.正规方程
2.梯度下降(参数:学习率)
理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新w值。
API
sklearn.linear_model.LinearRegression 正规方程(适合数据量小)
普通最小二乘线性回归
sklearn.linear_model.SGDRegressor 梯度下降 (适合数据量大(大于100K))
通过使用SGD最小化线性模型
coef_:回归系数
2.线性回归实例
示例:波士顿房价数据集预测房价
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import numpy as np
#实例化数据集
boston = load_boston()
print(boston.keys())
#分割数据集
x_train, x_test, y_train, y_test = train_test_split(boston.data,boston.target,random_state=0)
#标准化训练集,测试集,特征值和目标值都要转换
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.reshape(-1,1))
y_test=std_y.transform(y_test.reshape(-1,1))
#正规方程(没有准确率说法)
LR = LinearRegression()
LR.fit(x_train,y_train)
#打印回归系数
print('LR',LR.coef_)
#转回标准化前的格式
yl_predict = std_y.inverse_transform(LR.predict(x_test))
print(yl_predict)
#梯度下降
SGD = SGDRegressor()
SGD.fit(x_train,y_train)
ys_predict = std_y.inverse_transform(SGD.predict(x_test))
print(ys_predict)
print('SGD',SGD.coef_)
3.回归性能评估
(均方误差(Mean) Squared Error)MSE)评价机制:
注意:
为预测值,
为真实值
API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true,y_pred)
- 均方误差回归损失
- y_true:真实值
- y_pred:预测值
- return:浮点数结果
注:真实值,预测值为标准化之前的值
示例:接上例
from sklearn.metrics import mean_squared_error
print('正规方程的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),yl_predict))
print('梯度下降的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),ys_predict))
梯度下降 | 正规方程 |
---|---|
需要选择学习率alpha | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量n大时也能较好适用 | 需要计算 。如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O( ),通常来说当n小于10000时还是可以接受的 |
适用于各种类型的模型 | 只适用于线性模型,不适合逻辑回归模型的其他模型 |
特点: 线性回归是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
小规模数据:LinearRegression(不能解决过拟合问题以及其它)
大规模数据:SGDRegressor
过拟合: 一个假设在训练数据上能够获得比其他假设更好的拟合,但在训练数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
过拟合原因以及解决方法:
原因:原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点。
解决方法:进行特征选择,消除关联性大的特征(很难找)
交叉验证(让所有数据都有过训练)
正则化(了解)
L2正则化(岭回归:带有正则化的线性回归,解决过拟合)
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。
API
sklearn.linear_model.Ridge(alpha=1.0)
具有l2正则化的线性最小二乘法
- alpha:正则化力度 (力度越大,W权重越轻)
- coef_:回归系数
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变得更稳定。在存在病态数据偏多的研究中有较大的使用价值。
欠拟合: 一个假设在训练数据上不能获得更好的拟合,但在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
欠拟合的原因以及解决方法:
原因:学习到数据的特征过少
解决方法:增加数据的特征数量
4.sklearn模型的保存和加载
API
from sklearn.externals import joblib
保存:
joblib.dump(rf,'test.pk)
加载:
estimator=joblib.load(‘test.pkl’)
注:文件格式pkl
示例
from sklearn.externals import joblib
#保存模型
joblib.dump(SGD,'./SGD.pkl')
#加载模型
model=joblib.load('./SGD.pkl')
#运用模型
y_predict = std_y.inverse_transform((model.predict(x_test)))
print(y_predict)
5.分类算法-逻辑回归
应用场景(二分类)
- 广告点击率
- 是否垃圾邮件
- 是否患病
- 金融诈骗
- 虚假账号
线性回归输入→分类
sigmoid函数
输出:[0,1]区间的概率值,默认0.5作为阀值
逻辑回归的损失函数、优化(了解)
与线性回归原理相同,但由于是分类问题,损失函数不一样(对数似然损失),只能通过梯度下降求解
损失函数:均方误差(不存在多个局部最低点,只有一个最小值)
对数似然损失(尽量改善):多个局部最小值(1,多次随机初始化,多次比较最小值结果
2,求解过程当中,调整学习率)
5.逻辑回归实例
API
sklearn.linear_model.LogisticRegression
sklearn.linear_model.LogisticRegression(penalty=‘l2’,C=1.0)
- penalty=‘l2’,C=1.0 正则化系数
- Logistic 回归分类器
- coef_:回归系数
示例:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
cancer = load_breast_cancer()
print(cancer.keys())
print(cancer.target_names)
x_train, x_test, y_train, y_test = train_test_split(cancer.data,cancer.target,random_state=0)
lr = LogisticRegression(penalty='l2',C=1.0)
lr.fit(x_train,y_train)
y_prediction = lr.predict(x_test)
# print(cancer['target_names'][y_prediction])
print(lr.score(x_test,y_test))
print(lr.score(x_train,y_train))
print(classification_report(y_test,y_prediction,labels=[0,1],target_names=['恶性','良性']))
LogisticRegression总结
应用: 广告点击率预测、是否患病、金融诈骗、是否为虚假账号
优点: 适合需要得到一个分类概率的场景,简单,速度快
缺点: 不好处理多分类问题
6.聚类算法-kmeans
非监督学习(unsupervised learning)
主要方法:k-means
K:把数据划分成多少个类别
假设K=3(散点图)
1.随机在数据当中抽取三个样本,当做三个类别的中心点(k1,k2,k3)
2.计算其余的点分别到这三个中心点的距离,每一个样本有三个距离(a,b,c),从中选出距离最近的一个点作为自己的标记形成三个族群
3.分别计算这三个族群的平均值,把三个平均值与之前的三个旧中心点进行比较
如果相同:结束聚类
如果不相同:把这三个平均值当做新的中心点,重复第二步
API
sklearn.cluster.KMean(n_clusters=8,init='k-means++’)
- k-means 聚类
- n_clusters:开始的聚类中心数量
- init:初始化方法,默认为‘k-means ++’
- label_:默认标记的类型,可以和真实值比较(不是值比较)
#导入包
from sklearn.cluster import KMean
#实例化
kn = KMean(n_clusters=5)
kn.fit(x) # x为特征值数据
predict = kn.predict(x)
Kmeans性能评估指标
轮廓系数:[-1,1] 越靠近1越好
计算公式:
注:对于每个点i为已聚类数据中的样本,
为i到其它族群的所有样本的距离最小值,
为i到本身族的距离平均值
最终计算出所有的样本点的轮廓系数平均数
API
sklearn.metrics.silhouette_score(X,labels)
- 计算所有样本的平均轮廓系数
- X:特征值
- labels:被聚类标记的目标值
from sklearn.metrics import silhouette_score
print(silhouette_score(x,predict)
Kmeans总结
特点分析:
采用迭代式算法,直观易懂并且非常实用
缺点:容易收敛做到局部最优解(多次聚类)
注意:聚类一般做在分类之前