学习笔记:机器学习day3

1.回归算法-线性回归分析

回归:目标值连续
线性回归需要做标准化处理。

线性关系模型
一个通过属性的线性组合来进行预测的函数:
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x d + b f(x)=w_1x_1+w_2x_2+...+w_dx_d+b
w为权重(斜率),b为偏置项(截距)

损失函数(误差大小)

  • yi为第i个训练样本的真实值
  • hw(xi)为第i个样本特征值组合预测函数

总损失定义:
f ( θ = h w ( x 1 y 1 ) 2 + h w ( x 2 y 2 ) 2 + . . . + h w ( x m y m ) 2 f(θ)=(h_w(x_1)-y_1)^2+(h_w(x_2)-y_2)^2+...+(h_w(x_m)-y_m)^2
= i = 1 m ( h w ( x i ) y i ) 2 =\sum^{m}_{i=1}{(h_w(x_i)-y_i)^2}

又称最小二乘法

优化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)评价机制:
M S E = 1 m i = 1 m ( y 2 y ) 2 MSE=\frac{1}{m}\sum^{m}_{i=1}{(y^2-\overline{y})^2}
注意: y i y^i 为预测值, y \overline{y} 为真实值

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大时也能较好适用 需要计算 ( X T X ) 1 (X^TX)^{-1} 。如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O( n 3 n^3 ),通常来说当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越好
计算公式:
S C i = b i a i m a x ( b i a i ) SC_i =\frac{b_i-a_i}{max(b_ia_i)}
注:对于每个点i为已聚类数据中的样本, b i b_i 为i到其它族群的所有样本的距离最小值, a i a_i 为i到本身族的距离平均值
最终计算出所有的样本点的轮廓系数平均数

API
sklearn.metrics.silhouette_score(X,labels)

  • 计算所有样本的平均轮廓系数
  • X:特征值
  • labels:被聚类标记的目标值
from sklearn.metrics import silhouette_score
print(silhouette_score(x,predict)

Kmeans总结

特点分析:
采用迭代式算法,直观易懂并且非常实用
缺点:容易收敛做到局部最优解(多次聚类)
注意:聚类一般做在分类之前

发布了5 篇原创文章 · 获赞 5 · 访问量 135

猜你喜欢

转载自blog.csdn.net/Rick_Restart/article/details/105657385