机器学习笔记三
机器学习算法回归算法分析矩阵线性回归(迭代的算法)回归性能评估过拟合和欠拟合岭回归模型的保存和加载回归算法实例分类算法-逻辑回归朴素贝叶斯和逻辑回归对比损失函数对比 -- 梯度下降求解非监督学习-聚类算法-kmeans
机器学习算法
回归算法分析
分类和回归问题区别
回归
目标值连续 分类
离散型数据 回归应用
房价预测销售额的预测贷款额度预测 线性回归
寻找一种能够预测的趋势
线性关系
二维:直线关系三维:特征和目标值,在一个平面当中
线性关系定义
一个特征
y = kx +bb : 偏置
为了使对单个特征的情况更加通用 多个特征
y = W1* X1 + W2*X2 + … + WaXa + b
W:权重b: 偏置项
线性回归定义:特征和目标值之间进行建模的回归分析
矩阵
矩阵: 大多数算法的计算基础
数组和矩阵的区别
数组:
可以是0维 1维 2维 3维 等数组运算
加减乘除 矩阵
必须是2维的满足了一些的特定的运算需求
矩阵运算
矩阵相乘
(m行,l列)*(l行,n列) = (m行,n列)np.dot() In [2]: import numpy as np
In [3]: a = [[1,2,3,4,],[2,3,7,9]]
In [4]: b = [2,2,2,2]
In [6]: np.multiply(a,b) # 数组运算
Out[6]:
array([[ 2, 4, 6, 8],
[ 4, 6, 14, 18]])
In [7]: b = [[2],[2],[2],[2]]
In [8]: np.dot(a,b)
Out[8]:
array([[20],
[42]])
线性回归(迭代的算法)
回归
知道误差,就去不断减少误差
迭代的过程
算法策略(损失函数)优化
策略(损失函数)
最小二乘法所有 的(预测值 - 实际值)^2 的和就是误差误差平方和
优化
寻找最优的W值使得损失函数最小求W的方法
正规方程
数据复杂的时候很难求到 梯度下降
影响因素: 学习率
API
正规方程
sklearn.linear_model.LinearRegression
回归系数(权重)
coef_ 普通最小二乘线性回归 梯度下降
sklearn.linear_model.SGDRegressor
coef_ 通过使用SGD最小化线性模型 容易出现过拟合
使用正则化
岭回归
scikit-learn的优缺点
优点
封装好,建立模型简单,预测简单 缺点
算法的过程,有写参数都字啊算法API内部优化,参数难找 tensorflow:
封装高低,自己实现线性回归,学习率什么的都可以自己指定,过程可以看到
线性回归需要做标准化处理
正规方程和梯度下降对比
梯度下降
需要学习率需要多次迭代适用于特征量大的实例适用于各种类型的模型 正规方程
不需要学习率一次运算得出结果特征量少的时候用的多,一般特征小于10000时使用一般只用在特征量少的线性模型不能解决你和问题
回归性能评估
使用均方误差API
sklearn.metrics.mean_squared_error
参数
测试数据预测的目标值测试数据实际的目标值
过拟合和欠拟合
问题
训练数据训练的很好,但是在测试数据中不是很好
过拟合
学习的东西太多训练集比较好,测试集不好模型过于复杂原因
原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型兼顾各个测试数据点 解决办法
特征选择,消除关联大的特征(比较难)交叉验证(让所有数据都有过训练) - 检验出正则化(了解)
尽量减少高次项的权重岭回归-带有正则化
欠拟合
学习的东西太少训练集和测试集数据误差都大模型过于简单原因
学习数据的特征过少 解决方法
增加数据的特征数量
模型复杂的原因
原因:
数据的特征和目标值之间不仅仅是线性关系
判断方法
看交叉验证训练集的结果和测试集的结果欠拟合
训练集结果和测试集结果都不行 过拟合
训练集结果很好,测试集下降幅度大
回归解决过拟合
L2正则化: Ridge:岭回归,带有正则化的线性回归
岭回归
带有正则化的回归
解决过拟合 API
sklearn.linear_model.Ridge(alpha=1.0)
参数
alpha: 正则化力度(超参数)
取值范围 0-1之间/1-10之间 coef_: 回归系数 正则化力度对结果的影响
力度越来越大,权重越来越小,模型越来越简单 优势
回归更符合实际,更可靠在异常数据较多的时候使用岭回归 alpha超参数可以使用网格搜索来进行对数据的优化
模型的保存和加载
将训练好的模型储存起来,再后在直接加载使用模块
from sklearn.externals import joblib
0.8版本 最新版本中直接导入joblib使用
import joblib 保存
joblib.dump(实例化的模型,“文件名.pkl”) 加载
joblib.load(“文件名.pkl”)
回归算法实例
线性回归:正规方程、梯度下降、岭回归、模型保存和加载 波士顿房价预测
from sklearn
.datasets
import load_boston
from sklearn
.preprocessing
import StandardScaler
from sklearn
.linear_model
import LinearRegression
, SGDRegressor
, Ridge
from sklearn
.model_selection
import train_test_split
from sklearn
.metrics
import mean_squared_error
import joblib
def linear_regression(x_train
, x_test
, y_train
, y_test
, std_y
):
"""
正规方程
:param x_train:
:param x_test:
:param y_train:
:param y_test:
:return:None
"""
print("正规方程")
lr
= LinearRegression
()
lr
.fit
(x_train
, y_train
)
print("回归系数:")
print(lr
.coef_
)
y_predict
= std_y
.inverse_transform
(lr
.predict
(x_test
))
print("测试集中的预测房价:\n", y_predict
)
print("均方误差:", mean_squared_error
(std_y
.inverse_transform
(y_test
), y_predict
))
print("*" * 50)
return None
def SGD(x_train
, x_test
, y_train
, y_test
, std_y
):
"""
梯度下降预测房价
:param x_train:
:param x_test:
:param y_train:
:param y_test:
:param std_y:
:return:
"""
print("梯度下降")
sgd
= SGDRegressor
()
sgd
.fit
(x_train
, y_train
.ravel
())
print("回归系数:")
print(sgd
.coef_
)
y_predict
= std_y
.inverse_transform
(sgd
.predict
(x_test
))
print("测试集中的预测房价:\n", y_predict
)
print("均方误差:", mean_squared_error
(std_y
.inverse_transform
(y_test
), y_predict
))
print("*" * 50)
return None
def ridge(x_train
, x_test
, y_train
, y_test
, std_y
):
"""
岭回归,预测房价
:param x_train:
:param x_test:
:param y_train:
:param y_test:
:param std_y:
:return: None
"""
print("岭回归")
rd
= Ridge
(alpha
=1.0)
rd
.fit
(x_train
, y_train
.ravel
())
print("回归系数:")
print(rd
.coef_
)
y_predict
= std_y
.inverse_transform
(rd
.predict
(x_test
))
print("测试集中的预测房价:\n", y_predict
)
print("均方误差:", mean_squared_error
(std_y
.inverse_transform
(y_test
), y_predict
))
model
= joblib
.load
("../file/models/test.pkl")
model_y_predict
= std_y
.inverse_transform
(model
.predict
(x_test
))
print("训练模型测试集中的预测房价:\n", model_y_predict
)
print("均方误差:", mean_squared_error
(std_y
.inverse_transform
(y_test
), model_y_predict
))
return None
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)
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
.fit_transform
(y_test
.reshape
(-1, 1))
linear_regression
(x_train
, x_test
, y_train
, y_test
, std_y
)
SGD
(x_train
, x_test
, y_train
, y_test
, std_y
)
ridge
(x_train
, x_test
, y_train
, y_test
, std_y
)
return None
if __name__
== '__main__':
mylinear
()
分类算法-逻辑回归
应用场景
一般应用于二分类中使用广告点击率是否为垃圾邮件是否患病金融诈骗虚假账号 得出具体的概率输入
与线性回归的输入一样 会出现的问题
过拟合 sigmoid函数
将数据转换到 0-1 之间输出将输入转换成概率值g(z)=1/(1+e^(-z))
e:2.71z:回归的结果 策略(损失函数)
对数似然函数
y=1
(-log(h(x))) y=0
(-log(1-h(x))) 梯度下降求解 优化API - 自带正则化
sklearn.linera_model.LogisticRegression
参数
penalty
正则化 C
正则化力度 评估方法
召回率 判定规则
哪一个类别少,判定概率值是指的这个类别,则:概率小的为正例 总结
优点
得到一个分类概率的场景,简单,速度快 缺点
不好处理多分类问题 多分类使用 softmax方法实例 癌症预测
import pandas
as pd
import numpy
as np
from sklearn
.model_selection
import train_test_split
from sklearn
.preprocessing
import StandardScaler
from sklearn
.linear_model
import LogisticRegression
from sklearn
.metrics
import classification_report
def logistic():
"""
逻辑回归做二分类进行癌症预测(根据属性特征)
:return:None
"""
column
= ['Sample code number', 'Clump Thickness',
'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'MarginalAdhesion', 'Single Epithelial Cell Size',
'Bare Nuclei', 'BlandChromatin', '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]])
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
.coef_
)
print("准确率:",lg
.score
(x_test
,y_test
))
print("召回率:",classification_report
(y_test
, y_predict
,target_names
=["良性","恶性"], labels
=[2,4]))
return None
if __name__
== '__main__':
logistic
()
朴素贝叶斯和逻辑回归对比
逻辑回归
解决问题
二分类 应用场景
二分类问题(需要概率) 参数
正则化力度 判别模型 朴素贝叶斯
解决问题
多分类(一般为文本分类) 应用场景
文本分类 参数
没有参数 生成模型 共同点
得出的结果都有概率解释 生成模型和判别模型
生成模型
朴素贝叶斯隐马尔科夫模型 判别模型
K-近邻决策树随机森林神经网路 判别依据
有没有先验概率先验概率
是否需要在历史数据中总结出概率信息
损失函数对比 – 梯度下降求解
均方误差
不存在多个局部最低点,只有一个最小值 对数似然
有多个局部最小值
目前解决不了的问题,很难找到整个的最低点-只能尽量改善 尽管没有全局最低点,但是效果都是不错的 解决多个局部最小值的方法(不能确保解决-只是尽量改善)
多次随机初始化,多次比较最小值结果求解过程中调整学习率
非监督学习-聚类算法-kmeans
非监督学习聚类算法
k-means
k将数据划分成多少个类别一般是知道的如果不知道就作为超参数 步骤
随机在样本数据中抽取k个样本,当做三个类别的中心点计算其余点分别到这k个中心点的距离,每一个样本有K个距离,从中选取距离最近的点作为自己的标记形成k个族群分别计算这k个族群的平均值,把K个平均值与之前的K个就的中心点进行比较
如果相同
结束聚类 如果不同
把这K个平均值当做新的中心点,重复第二步 API
sklearn.cluster.KMeans()
参数
n_clusters:开始的聚类中心点数量init:初始化方法,默认为k-means++labels_:默认标记类型,可以和真实值比较(不是值比较) 聚类
一般做在分类之前 实例在jupyter notebook上 7.评估
轮廓系数
[-1,1] 之间距离1越近越好 API
sklearn.metrics.silhouette_score(X,labels)
参数
X:特征值labels:被聚类标记的目标值 总结
特点
采用迭代算法,直观易懂并且实用 缺点
容易收敛到局部最优解(多次取值进行聚类) 注意
聚类一般做在分类之前 实例 用户对物品类别的喜好 数据集
import pandas
as pd
from sklearn
.decomposition
import PCA
from sklearn
.cluster
import KMeans
from sklearn
.metrics
import silhouette_score
import matplotlib
.pyplot
as plt
prior
= pd
.read_csv
("./order_products__prior.csv")
products
= pd
.read_csv
("./products.csv")
orders
= pd
.read_csv
("./orders.csv")
aisles
= pd
.read_csv
("./aisles.csv")
_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"])
mt
.head
(10)
交叉表(特殊的分组)
行
:用户
id
列
:物品 的个数
cross
= pd
.crosstab
(mt
["user_id"],mt
["aisle"])
cross
.head
(10)
pca
= PCA
(n_components
=0.9)
data
= pca
.fit_transform
(cross
)
data
.shape
x
= data
[:500]
x
.shape
km
= KMeans
(n_clusters
=4)
km
.fit
(x
)
predict
= km
.predict
(x
)
predict
plt
.figure
(figsize
=(10,10))
colors
= ["green","orange","blue","cyan"]
colr
= [colors
[i
] for i
in predict
]
plt
.scatter
(x
[:,1],x
[:,20],color
=colr
)
plt
.xlabel
("1")
plt
.ylabel
("20")
plt
.show
()
silhouette_score
(x
,predict
)