提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
机器学习算法基础-day03
5. 回归
5.2 分类算法之逻辑回归
逻辑回归(Logistic Regression),简称LR。它的特点是能够使我们的特征输入集合转化为0和1这两类的概率。一般来说,回归不用在分类问题上,因为回归是连续型模型,而且受噪声影响比较大。如果非要应用进入,可以使用逻辑回归。了解过线性回归之后再来看逻辑回归可以更好的理解。
逻辑回归是解决二分类问题的利器
Logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测。g(z)可以将连续值映射到0和1上。Logistic回归用来分类0/1问题,也就是预测结果属于0或者1的二值分类问题
输入
sigmoid函数
逻辑回归公式
5.2.1 逻辑回归的损失函数、优化(了解)
与线性回归原理相同,但由于是分类问题,
损失函数不一样,只能通过梯度下降求解
当y=1时:
5.2.2 sklearn逻辑回归API
sklearn.linear_model.LogisticRegression
sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)
Logistic回归分类器
coef_:回归系数
5.2.3 LogisticRegression回归案例
良/恶性乳腺癌肿瘤预测
良/恶性乳腺癌肿数据:
原始数据的下载地址:
https://archive.ics.uci.edu/ml/machine-learning-databases/
数据描述
(1)699条样本,共11列数据,第一列用语检索的id,后9列分别是与肿瘤
相关的医学特征,最后一列表示肿瘤类型的数值。
(2)包含16个缺失值,用”?”标出。
良/恶性乳腺癌肿分类流程
1、网上获取数据(工具pandas)
2、数据缺失值处理、标准化
3、LogisticRegression估计器流程
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error,classification_report
from sklearn.externals import joblib
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()
print(data.head(10))
print(data.info())
#进行数据的分割
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)
lg.fit(x_train,y_train) #用对数似然损失,不断去求最小值,去优化w值
print(lg.coef_)
print("准确率:",lg.score(x_test,y_test))
y_predict=lg.predict(x_test)
print("召回率:",classification_report(y_test,y_predict,labels=[2,4],target_names=["良性","恶性"]))
return None
if __name__=="__main__":
logistic()
运行结果:
Sample code number Clump Thickness Uniformity of Cell Size \
0 1000025 5 1
1 1002945 5 4
2 1015425 3 1
3 1016277 6 8
4 1017023 4 1
5 1017122 8 10
6 1018099 1 1
7 1018561 2 1
8 1033078 2 1
9 1033078 4 2
Uniformity of Cell Shape Marginal Adhesion Single Epithelial Cell Size \
0 1 1 2
1 4 5 7
2 1 1 2
3 8 1 3
4 1 3 2
5 10 8 7
6 1 1 2
7 2 1 2
8 1 1 2
9 1 1 2
Bare Nuclei Bland Chromatin Normal Nucleoli Mitoses Class
0 1 3 1 1 2
1 10 3 2 1 2
2 2 3 1 1 2
3 4 3 7 1 2
4 1 3 1 1 2
5 10 9 7 1 4
6 10 3 1 1 2
7 1 3 1 1 2
8 1 1 1 5 2
9 1 2 1 1 2
<class 'pandas.core.frame.DataFrame'>
Int64Index: 683 entries, 0 to 698
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Sample code number 683 non-null int64
1 Clump Thickness 683 non-null int64
2 Uniformity of Cell Size 683 non-null int64
3 Uniformity of Cell Shape 683 non-null int64
4 Marginal Adhesion 683 non-null int64
5 Single Epithelial Cell Size 683 non-null int64
6 Bare Nuclei 683 non-null object
7 Bland Chromatin 683 non-null int64
8 Normal Nucleoli 683 non-null int64
9 Mitoses 683 non-null int64
10 Class 683 non-null int64
dtypes: int64(10), object(1)
memory usage: 64.0+ KB
None
[[1.46233238 0.27145418 0.88323024 0.40627111 0.27986597 1.48136204
0.80658709 0.66461217 0.54339988]]
准确率: 0.9532163742690059
召回率: precision recall f1-score support
良性 0.96 0.97 0.97 118
恶性 0.94 0.91 0.92 53
accuracy 0.95 171
macro avg 0.95 0.94 0.94 171
weighted avg 0.95 0.95 0.95 171
Process finished with exit code 0
5.2.4 LogisticRegression总结
应用:广告点击率预测、电商购物搭配推荐
优点:适合需要得到一个分类概率的场景
缺点:当特征空间很大时,逻辑回归的性能不是很好
(看硬件能力)
6. 非监督学习
无监督学习,顾名思义,就是不受监督的学习,一种自由的学习方式。该学习方式不需要先验知识进行指导,而是不断地自我认知,自我巩固,最后进行自我归纳,在机器学习中,无监督学习可以被简单理解为不为训练集提供对应的类别标识(label),其与有监督学习的对比如下:
有监督学习(Supervised Learning)下的训练集:
(x(1),y(1)),(x(2),y2)(x(1),y(1)),(x(2),y2)
无监督学习(Unsupervised Learning)下的训练集:
(x(1)),(x(2)),(x(3))(x(1)),(x(2)),(x(3))
在有监督学习中,我们把对样本进行分类的过程称之为分类(Classification),而在无监督学习中,我们将物体被划分到不同集合的过程称之为聚类(Clustering)
6.1 k-means步骤
1、随机设置K个特征空间内的点作为初始的聚类中心
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类
中心点作为标记类别
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平
均值)
4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行
第二步过程
6.1.1 k-means API
sklearn.cluster.KMeans
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
k-means聚类
n_clusters:开始的聚类中心数量
init:初始化方法,默认为’k-means ++’
labels_:默认标记的类型,可以和真实值比较(不是值比较)
6.1.2 案例:k-means对Instacart Market用户聚类
1、降维之后的数据
2、k-means聚类
3、聚类结果显示
#把样本数量减少(降维之后的数据,27列)
x=data[:500]
x.shape
#假设用户一共分为四个类别,
km=KMeans(n_clusters=4)
km.fit(x)
x_predict=km.predict(x)
plt.figure(figsize=(10,10),dpi=80)
#建立四个颜色列表
colored=['orange','green','blue','purple']
color_list=[colored[i] for i in x_predict]
#绘制散点图(取两个特征值)
plt.scatter(x[:,1],x[:,20],color=color_list)
plt.xlabel=("1")
plt.ylabel=("20")
plt.title("sort by four")
#plt.show()
silhouette_score(x,x_predict)
运行结果:
0.6015157315402805
6.1.3 Kmeans性能评估指标
如果〖𝑠𝑐〗_𝑖 小于0,说明𝑎_𝑖 的平均距离大于最近的其他簇。
聚类效果不好
如果〖𝑠𝑐〗_𝑖 越大,说明𝑎_𝑖 的平均距离小于最近的其他簇。
聚类效果好
轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优
6.1.4 Kmeans性能评估指标API
sklearn.metrics.silhouette_score
sklearn.metrics.silhouette_score(X, labels)
计算所有样本的平均轮廓系数
X:特征值
labels:被聚类标记的目标值
6.1.5 Kmeans总结
特点分析:
采用迭代式算法,直观易懂并且非常实用
缺点:容易收敛到局部最优解(多次聚类)
需要预先设定簇的数量(k-means++解决)