机器学习
三天入门机器学习
1.1 人工智能概述
1.1.1 机器学习与人工智能 深度学习
达特茅斯会议-人工智能的起点
机器学习是人工智能的一个实现途径
深度学习是机器学习的一个方法发展而来
1.1.2机器学习、深度学习能做些什么
传统预测 量化投资 广告推荐
图像识别
自然语言处理 文本分类 情感分析 文本检测
1.2什么是机器学习
1.2.1 定义
从数据中自动分析获得模型 并利用模型对未知数据进行预测
1.2.3 数据集构成
结构:特征值+目标值
每一行数据称为样本
有些数据集可以没有目标值
1.3 机器学习算法分类
1.3.1 监督学习
目标值:类别 - 分类问题
目标值:连续型数据-回归问题
目标值:无-无监督学习
-
监督学习
分类k-近邻算法 贝叶斯分类 决策树随机森林 逻辑回归
回归 线性回归 岭回归
-
无监督学习
K-MEANS
1.4 机器学习开发流程
获取数据 -> 数据处理 -> 特征工程-> 机器学习算法训练->模型 ->模型评估
1.5 学习框架和资料介绍
算法是核心 数据与计算是基础
找准定位
怎么做?
1、入门
2、实战类书籍
3、机器学习 -”西瓜书”- 周志华
统计学习方法 - 李航
深度学习 - “花书”
1.5.1 机器学习库与框架
2.1 数据集
- 目标
- 直到数据集分为训练集和测试集
- 会使用sklearn的数据集
2.1.1可用数据集
公司内部 百度
数据接口 花钱
数据集
Kaggle:www.kaggle.com/datasets
UCI 数据集: http://archive.ics.uci.edu/ml/
scikit-learn: http://scikit-learn.org/stable/datasets/index.html#datasets
数据接口 花钱
数据集
学习阶段可以用的数据集:
1)sklearn - 数据量小 方便学习
2)kaggle 大数据竞赛平台
3)UCI
Scikit-learn工具介绍
classification ->分类
regression ->回归
clustering->聚类
dimensionality reduction ->降维
model selection ->模型选择
preprocessing ->特征工程
2.1.2 sklearn 数据集
1 scikit-learn 数据集api介绍
- sklearn.datasets
- 加载获取流行的数据集
- dataset.load_*()
- 获取小规模数据集 数据包含在datasets里
- datasets.fetch_*(data_home = None)
- 获取大规模数据集 从网络上下载 函数第一个参数是data_home表示数据集下载的目录 默认是~/scikit_learn_data/
2 sklearn 小数据集
-
sklearn.datasets.load_iris()
加载并返回鸢尾花数据集
-
sklearn.datasets.load_boston()
加载并返回波士顿房价数据集
3 sklearn大数据集
- sklearn.datasets.fetch_20newsgroups(data_home = None,subset = ‘train’)
- subset: ‘train’或者’test’ 'all’可选 选择要加载的数据集
- 训练集的训练 测试集的测试
4 sklearn数据集的使用
-
load 和 fetch 返回的数据类型databases.base.Bunch(字典格式)
1
2dict["key"] = values
bunch.key = values-
data:特征数据数组 是[n_samples *n _features]的二维numpy.ndarray数组
-
target:标签数组 是n_samples的一维numpy.ndarray数组
-
DESCR:数据描述
-
feature_names:特征名 新闻数据 手写数字 回归数据集没有
-
target_name:标签名
1
2
3
4
5
6
7
8
9
10
11
12
13
14from sklearn.datasets import load_iris
def datasets_demo():
# 获取数据集
iris = load_iris()
print("鸢尾花数据集:\n", iris)
print("查看数据集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n",iris.feature_names)
#150个样本 4个特征
print("查看特征值:\n",iris.data,iris.data.shape)
return None
if __name__ == "__main__":
# 代码1:数据集使用
datasets_demo()
-
拿到的数据是否可以全部用来训练一个模型?
2.1.3 数据集的划分
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
划分比例:
-
训练集 70% 80% 75%
-
测试集 30% 20% 30%
-
sklearn.model_selection.train_test_split(arrays, *options)
-
训练集特征值,测试集特征值,训练集目标值,测试集目标值
x_train x_test, y_train y_test -
x 数据集的特征值
-
y数据集的标签值
-
test_size 测试集大小 一般为float
-
random_state 随机数种子 不同种子会造成不同的随机采样结果 相同的种子采样结果相同
-
return 训练集特征值 测试集特征值 训练集目标值 测试集目标值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def datasets_demo():
# 获取数据集
iris = load_iris()
print("鸢尾花数据集:\n", iris)
print("查看数据集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
# 150个样本 4个特征
print("查看特征值:\n", iris.data, iris.data.shape)
# 数据集划分
x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("训练集的特征值:\n", x_train, x_train.shape)
return None
if __name__ == "__main__":
# 代码1:数据集使用
datasets_demo()
2.2 特征工程介绍
算法 特征工程
2.2.1 为什么需要
数据与特征决定上限 模型和算法只是逼近上限
2.2.2 什么是特征工程
sklearn 特征工程
pandas 数据清洗、数据处理
特征抽取/特征提取
机器学习算法 - 统计方法 - 数学公式
文本类型 -> 数值
类型 -> 数值
2.3.1 特征提取
1 将任意数据(文本、图像)转换为可用于机器学习的数字特征
注:特征值化是为了计算机更好的去理解
-
字典特征提取(特征离散化)
-
文本特征提取
-
图像特征提取
2 特征提取API
sklearn.feature_extraction
2.3.2 字典特征提取 -类别->one-hot编码
作用:对字典数据特征值化
-
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
-
vector 数学:向量 物理:矢量
矩阵 matrix 二维数组
向量 vector 一维数组 -
父类:转换器类
-
DictVectorizer.fit_transform(X):字典或者字典的迭代器返回值:返回sparse矩阵 DictVectorizer.inverse_transform(X):array数组或者sparse矩阵:返回值:转换之前的数据格式 DictVectorizer.get_feature_names_out():返回类别名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
![snipaste20230717_112943](https://cdn.jsdelivr.net/gh/paipai2001/img@main/blogs/snipaste20230717_112943.jpg)
**sparse稀疏**
**将非零值->按位置表示出来**
**节省内存->提高加载效率**
![snipaste20230717_114105](https://cdn.jsdelivr.net/gh/paipai2001/img@main/blogs/snipaste20230717_114105.jpg)
```py
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、 实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new)
print("特征名字:\n",transfer.get_feature_names_out())
return None
if __name__ == "__main__":
dict_demo()
应用场景:
1.pclass, sex 数据集当中类别特征比较多
1、将数据集的特征->字典类型
2、DictVectorizer 转换
2) **本身拿到的数据就是字典类型**
2.3.3 文本特征提取
单词作为特征
句子 短语 单词
特征:特征词
方法1:CountVectorizer
sklearn.feature_extraction.text.CountVectorizer(stop words = [])
- stop_words 停用的 对最终分类没有用处
- 停用词表
返回词频矩阵
1 |
|
案例:
1 |
|
-
统计每个样本特征词出现的个数
-
中文转换器 需要使用空格
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17def count_chinese_demo():
"""
中文文本特征抽取:CountVecotrizer
:return:
"""
data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None注意:如果要调用特征名字 得用实例化对象调用 如果是查询具体数据 用调用后得出的结果
方法2: jieba这一自动分节器
1 |
|
ps: 装包的时候 一般是要进入那个路径的 以电脑3.11这个版本为例
cd venv\Scripts 找到那个activate.bat 启动它 才能开始安装
- 关键词:在某一个类别的文章中出现很多 但其他类别的文章中出现很少
方法3: TfidfVectorizer
-
TF-IDF:评估某一字词重要程度
-
词频(TF): 某一个给定的词语在一篇文章中出现的频率
-
逆向文档频率(IDF):总文件数目除以包含该词语文件的数目 再取以10为底的对数
-
TF-IDF = TF*IDF
-
两个词 “经济”,“非常”
1000篇文章-语料库
100篇文章 - “非常”
10篇文章 - “经济”
两篇文章
文章A(100词) : 10次“经济” TF-IDF:0.2相乘
tf:10/100 = 0.1
idf:lg 1000/10 = 2
文章B(100词) : 10次“非常” TF-IDF:0.1
tf:10/100 = 0.1
idf: log 10 1000/100 = 1
对数?
2 ^ 3 = 8
log 2 8 = 3
log 10 10 = 1
API
-
sklearn.feature_extraction.text.TfidVectorizer(stop_words=None,…)
-
- 返回词的权重矩阵
- TfidfVectorizer.fit_transform(X):文本或者文本的迭代器返回值:返回sparse矩阵
- TfidfVectorizer.inverse_transform(X):array数组或者sparse矩阵:返回值:转换之前的数据格- T封TfidfVectorizer.get_feature_names_out():返回值:单词列表
- 返回词的权重矩阵
案例和自动分节器差不多不再重复了
2.4 特征预处理
2.4.1 定义
通过一些转换函数将特征数据转换成更适合算法模型的特征数据过程
1 包含内容
-
数值型数据量纲化:
-
归一化
-
标准化
不同规格的数据转换成统一规格 单位大小差距过大
-
2 特征预处理API
sklearn.preprocessing
2.4.2 归一化
1 定义
通过对原始数据进行变换把数据映射到0-1区间
2 API
-
sklearn.preprocessing.MinMaxScaler(feature_range = (0,1)...)
-
MinMaxscalar.fit_transform(X)
-
X: numpy array 格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
-
-
3 数据计算
1 |
|
劣处:出现异常值 比如极大极小 那么最终结果也会不准
本身就是依靠最大最小求值 鲁棒性差 精确性差
2.4.3 标准化
1 定义
原始数据进行变换把数据变换到均值为0 标准差为1
2 公式
1 |
|
出现异常点也不需要担忧
方差改变较小
3 API
sklearn.preprocessing.StandardScaler(feature_range = (0,1)...)
-
StandardScalar.fit_transform(X)
-
X: numpy array 格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
-
4 数据计算
类似 不再赘述 适合大数据场景
2.5 特征降维
2.5.1 降维
ndarray
维数:嵌套的层数
0维:标量
1维:向量
2维:矩阵
二维数组
在某些限定条件下 降低随机变量(特征)个数 得到一组主变量
效果:要求特征与特征之间不相关
2.5.2 降维的两种方式
- 特征选择
- 主成分分析
2.5.3 什么是特征选择
1 定义
数据中包含冗余或者相关变量(特征) 在原有特征中找到主要特征
2 方法
-
Filter(过滤式):主要探究特征本身特点 特征与特征和目标值之间关联
- 方差过滤法:低方差特征过滤(所有鸟都有爪子)
- 相关系数 - 特征与特征之间的相关程度
-
Embedded(嵌入式):算法自动选择特征(特征与目标
-
决策树:信息熵 信息增益
-
正则化:L1 L2
-
深度学习:卷积等
-
嵌入式只能讲解算法时候介绍
3 模块
sklearn.feature_selection
4 过滤式
4.1 低方差特征过滤
4.1.1 API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
-
VarianceThreshold.fit_transform(X)
-
X: numpy array 格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除 默认值保留所有非零方差特征
-
4.1.2 实例
1 |
|
4.2 相关系数
皮尔森相关系数 pearson
公式:
4.2.3 特点
相关系数介于-1到+1之间
- r>0 两变量正相关 r < 0 两变量负相关
- |r| = 1两变量完全相关 r = 0 两变量无相关关系
- |r|越接近1,线性关系越密切 接近0 线性相关越弱
- <0.4 低度相关 0.4-0.7 显著性相关 >0.7 高度相关
4.2.4 API
- from scipy.stats import pearson
- x:
- y:
两个特征的相关性
4.2.5 股票案例
1 |
|
可以利用for循环输出多对
特征与特征相关性很高
-
选取其中一个
-
按一定权重加权求和
-
主成分分析
1 |
|
2.6 主成分分析
2.6.1 什么是主成分分析(PCA)
高维数据转化为低维数据 舍弃原有数据 创造新的变量
降低原数据复杂度
回归分析或者聚类分析
1 计算案例
五个点变成三个点 二维变一维
2 API
-
sklearn.decomposition.PCA(n_components = None)
1
2
3n_components
小数 表示保留百分之多少的信息
整数 减少到多少特征-
PCA.fit_transform(X)
-
返回值:转换后制定维度的array
-
3 数据计算
1 |
|
2.6.2 探究用户对物品类别的喜好细分
1 需求
1 |
|
2 分析
1 |
|
3.1 sklearn转换器和估计器
3.1.1 转换器
转换器调用形式
-
fit_transform
-
fit
-
transform
1 |
|
3.1.2 估计器estimator
在sklearn中 实现算法api
流程图:
1 |
|
3.2 K-近邻算法 KNN
3.2.1 什么是KNN
1 原理
你的邻居来判断你的类别
如果一个样本在特征空间的k个最相似(特征空间中最邻近)的样本中大多数属于某一个类别
k = 1 容易受到异常点的影响
-
距离公式
两个样本的距离可以通过如下公式计算 欧式距离:
曼哈顿距离 绝对值距离
明可夫斯基距离
2 电影类型分析
假设有几部电影 六个样本 打斗镜头 接吻镜头 目标:类型
1 |
|
3 问题
- 如果取的电影数量不一样?会是什么结果?
- 结合前面约会数据 需要对数据怎么样预处理?
1 |
|
3.2.2 KNN API
1 |
|
3.2.3 案例
1 数据集介绍
iris数据集
1 |
|
1 |
|
不能使用太大的数据量 开销很大
3.3 模型选择与调优
3.3.1 什么是交叉验证
1 分析
2 目的
模型准确可信
3.3.2 超参数搜索-网格搜索(Grid-Search)
1 |
|
模型中有一些参数需要我们手动指定 于是就可以调优
模型选择与调优API
3.3.3 鸢尾花改进
1 |
|
3.3.4 预测facebook签到位置
1 数据集介绍
- row_id: 索引 (无意义)
- x y:(人所在的位置)
- accuracy:(定位的准确度)
- time:(在哪个时间在定位位置)
- place_id;用户将要签到的位置
1 |
|
2 实际操作
1 |
|
结果:
1 |
|
3.4 朴素贝叶斯算法
3.4.1 什么是朴素贝叶斯算法
3.4.2 概率基础
3.4.3 联合概率 条件概率 相互独立
3.4.4 贝叶斯公式
1 公式
- 注:w为给定文档的特征值(频数估计 预测文档提供)c为文档类别
1 |
|
2 文章分类计算
P© = 3/4 属于china类的概率
3 拉普拉斯平滑系数
防止计算出的分类概率为 0
P(F1|C) =(Ni+a)/N+am
a 为指定系数一般为1 m为训练文档中统计出的特征词个数
3.4.5 API
sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
- 朴素贝叶斯分类
- alpha:拉普拉斯平滑系数
3.4.6 案例:20个新闻组
1 |
|
代码:
1 |
|
3.4.7 总结
1 |
|
3.5 决策树
3.5.1 认识决策树
1 |
|
if-else
3.5.2 决策树原理详解
1 |
|
问题:如何对这些客户进行分类预测?
1 原理
- 信息熵 信息增益
2 信息熵的定义 信息的衡量 - 信息量 - 信息熵
-
H的专业术语称为信息熵 单位为比特
P(xi)lobb(P(xi))的和
1 |
|
结果是0.971
3 决策树的划分依据之一——信息增益
- 定义与公式
特征A对训练集D的信息增益g(D,A) 定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵的H(D|A)之差:
g(D,A) = H(D) - 条件熵H(D|A)
4 其他依据
-
ID3
- 信息增益最大的准则
-
C4.5
- 信息增益比 最大的准则
-
CART
-
分类树:基尼系数 最小的准则 在sklearn中可以划分的默认原则
-
优势:划分更加细致
-
3.5.3 决策树API
-
class sklearn.tree.DecisionTreeClassifier(criterion = 'gini',
-
max_depth = None,random_state = None)
-
决策树分类器
-
criterion:默认是‘gini’系数 可以选择信息增益的熵’entropy’
-
max_depth:树的深度大小
-
random_state:随机数种子
-
鸢尾花的例子:
1 |
|
没有免费的午餐:总是想找到一个算法一劳永逸
样本数目太少了
3.5.4 案例:泰坦尼克号乘客生存预测
- 泰坦尼克号数据
1 乘坐班是指乘客班(1,2,3) 社会经济阶层的代表
2 其中age数据存在缺失
数据:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
分析步骤
1 |
|
选择若干个重要的特征
1 |
|
3.5.3 决策树可视化
1 保存树的结构到dot文件
- sklearn.tree.export_graphviz()该函数可以导出DOT格式
- tree.export_graphviz(estimator, out_file = “tree.dot”,feature_names = [‘’,'])
export_graphviz(dc, out_file = "./tree.dot",feature_names = ['age','plcass=1'])
2 网站结构
3.5.6 总结
1 |
|
3.6 集成学习方法之随机森林
3.6.1 什么是集成学习方法
集成学习通过建立几个模型组合的来解决单一预测问题 它的工作原理是生成多个分类器/模型 各自独立学习和作出预测
因此优于任何一个单分类作出预测
3.6.2 什么是随机森林
在机器学习中 随机森林是一个包含多个决策树的分类器 并且输出类别是由个别树输出的类别的众数而定
假如训练了5个树 有四个树结果为true 1个树结果为false 最终投票结果为true
3.6.3 随机森林原理过程
1 |
|
学习算法根据下列算法建造每棵树:
-
用N来表示训练用例(样本)的个数 M表示特征数目
-
1 一次随机选择一个样本 重复N次
-
2 随机选出m个特征 建立决策树
-
-
采用bootstrap抽样
-
bootstrap 随机有放回抽样 [1, 2, 3, 4, 5] 新的树的训练集 [2, 2, 3, 1, 5] 特征随机 - 从M个特征中随机抽取m个特征 M >> m 降维
-
3.6.4 API
-
class sklearn.ensemble.RandomForestClassifier(n_estimator = 10,critetion = ‘gini’,
-
max_depth = None;bootstrap = True,random_state = None,min_samples_split = 2)
3.6.5 随机森林预测案例
5,8,15
超参数调优:
1 |
|
3.6.6 总结
1 |
|
4 回归与聚类算法
1 |
|
4.1线性回归
4.1.1 线性回归的内容
1 |
|
- 房价预测
- 销售额度预测
- 金融:贷款额度预测、利用线性回归
2 什么是线性回归
-
利用回归方程对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式
-
单变量回归 多变量回归
1
2
3线性关系
y = w1x1 + w2x2 + w3x3 + …… + wnxn + b(偏置)
= wTx(逆) + b
w x 理解成矩阵
1 |
|
1 |
|
4.1.2 线性回归的损失和优化原理(理解记忆)
1 |
|
不断更新权重与损失 两者差距越小越接近
如何衡量差距?
损失函数/cost/成本函数/目标函数
- 最小二乘法
1 损失函数
2 优化算法
如何去求模型中的W 使得损失最小?
直接求解w
1 |
|
- 梯度下降
4.1.3 线性回归API
-
sklearn.linear_model.LinearRegression(fit_intercept = True)
-
sklearn.linear_model.SGDRegressor(loss = "squared_loss",fit_intercept = True,learing_rate = 'invscaling',eta0 = 0.01)
-
不加上偏置只能过原点
- loss:损失函数
- 学习率:步长
4.1.4 波士顿房价预测
1 |
|
代码:
1 |
|
1 回归性能评估
均方误差评价机制:
1 |
|
模型评估:
1 |
|
值越小越好 表示误差程度
2 对比
梯度下降 | 正规方程 |
---|---|
需要选择学习率 | NO |
需要迭代求解 | 一次求解 |
特征数目较大可以使用 | 计算方程时间复杂度高 |
- 选择:
- 小规模数据:
- LinearRegression(不能解决拟合问题)
- 岭回归
- 大规模数据:SGDRegressor
- 小规模数据:
GD SGD SAG
4.2 欠拟合和过拟合
训练集上没事 但测试集表现很差
那估计就是过拟合
4.2.1 什么是过拟合与欠拟合
- 欠拟合 学习到的特征太少了
- 过拟合 学习到的特征太多了
定义
- 过拟合:一个假设在训练集上能够获得比其他假设更好的拟合 但在测试集上不能很好拟合数据 所以出现过拟合 模型过于复杂
- 欠拟合:一个假设在训练集和测试集都不能很好的拟合数据 模型过简单
4.2.2 原因以及解决办法
-
欠拟合原因以及解决办法
-
原因:学习到数据的特征过少
-
解决办法:增加数据的特征数量
-
-
过拟合原因以及解决方法
- 原因:原始特征过多 存在一些嘈杂特征 模型过于复杂是因为模型尝试去兼顾每个测试数据点
- 解决办法:正则化
-
减少高次项特征的影响
1 正则化
- L2正则化(常用)
- 让一些W更小 接近0 那么就可以削弱了
1 |
|
4.3 岭回归
4.3.1 带有L2正则化的线性回归——岭回归
算法建立回归方程的时候 加上正则化 解决过拟合的效果
1 API
Ridge方法相当于SGDRegressor(penalty = ‘l2’,loss = ‘squared_loss’),只不过这个实现了一个普通的梯度下降学习
2 观察正则化程度的变化 对结果的影响
3 波士顿房价预测
1 |
|
4.4 分类算法-逻辑回归与二分类
4.4.1 逻辑回归的应用场景
- 广告点击率
- 是否为垃圾邮件
- 是否患病
- 金融诈骗
- 虚假账号
1 |
|
4.4.2 逻辑回归原理
1 输入
逻辑回归的输入就是一个线性回归的结果
2 激活函数
-
sigmoid函数 结果代替x
1
1/(1 + e^(-x))
- 分析
- 回归的结果输入到sigmoid函数当中
- 输出结果:[0,1]区间中的一个概率值 默认0.5为阈值
1 |
|
3 损失以及优化
1 优化
逻辑回归的损失 对数似然损失 y为真实值
2 优化
同样使用梯度下降优化算法 去减少损失函数得知 这样去更新逻辑回归前面对应算法的权重参数 提升原本属于1 类别的概率 降低原本是0 的概率
4.4.3 逻辑回归API
-
sklearn.linear_model.LogisticRegression(solver = 'liblinear',penalty = 'l2',C=1.0) solver:优化求解方式 sag:根据数据集自动选择 随机平均梯度下降 penalty:正则化的种类 C:正则化力度
恶性 - 正例 流程分析: 1)获取数据 读取的时候加上names 2)数据处理 处理缺失值 3)数据集划分 4)特征工程: 无量纲化处理-标准化 5)逻辑回归预估器 6)模型评估1
2
3
4
5
6
7
> 默认将类别数量少的当做正例
### 4.4.4 案例:癌症分类预测
- https://archive.ics.uci.edu/ml/machine-learing-databases/
1 |
|
def logisticregression():
“”"
逻辑回归进行癌症预测
:return: None
“”"
# 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’]
data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",
names=column_name)
# 删除缺失值
data = data.replace(to_replace='?', value=np.nan)
data = data.dropna()
# 取出特征值
x = data[column_name[1:10]]
y = data[column_name[10]]
# 分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
# 进行标准化
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 使用逻辑回归
lr = LogisticRegression()
lr.fit(x_train, y_train)
print("得出来的权重:", lr.coef_)
# 预测类别
print("预测的类别:", lr.predict(x_test))
# 得出准确率
print("预测的准确率:", lr.score(x_test, y_test))
return None
1 |
|
0.5~1之间,越接近于1约好 因为y_true数值有要求 则大于2.5为1 否则为0
y_test = np.where(y_test > 2.5, 1,0)
print(“AUC指标:”, roc_auc_score(y_test, lr.predict(x_test)))
1 |
|
- 加载
1 |
|
说到这个 joblib这个模块自从sklearn升级后给剔除 成为一个独立的包 导入是:
import joblib
4.6 无监督学习-K-means算法
4.6.1 什么是无监督学习
没有目标值
- 一家广告平台需要根据相似的人口学特征和购买习惯将美国人口分成不同的小组,以便广告客户可以通过有关联的广告接触到他们的目标客户。
- Airbnb 需要将自己的房屋清单分组成不同的社区,以便用户能更轻松地查阅这些清单。
- 一个数据科学团队需要降低一个大型数据集的维度的数量,以便简化建模和降低文件大小。
我们可以怎样最有用地对其进行归纳和分组?我们可以怎样以一种压缩格式有效地表征数据?这都是无监督学习的目标,之所以称之为无监督,是因为这是从无标签的数据开始学习的。
4.6.2 无监督学习包含算法
- 聚类
- K-means(K均值聚类)
- 降维
- PCA
4.6.3 k-means原理
我们先来看一下一个K-means的聚类效果图
K-means聚类步骤
- 1、随机设置K个特征空间内的点作为初始的聚类中心(随机找K个点做中心)
- 2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
- 3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
- 4、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程
我们以一张图来解释效果
K-超参数
1)看需求
2)网格搜索 调节K值
K-means API
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
- k-means聚类
- n_clusters:开始的聚类中心数量 K的值
- init:初始化方法,默认为’k-means ++’
- labels_:默认标记的类型,可以和真实值比较(不是值比较)
4.6.5 案例:k-means对Instacart Market用户聚类
5.1 分析
- 1、降维之后的数据
- 2、k-means聚类
- 3、聚类结果显示
5.2 代码
1 |
|
问题:如何去评估聚类的效果呢?
4.6.6 Kmeans 性能评估指标
6.1 轮廓系数
高内聚 低耦合
注:对于每个点i 为已聚类数据中的样本 ,b_i 为i 到其它族群的所有样本的距离最小值,a_i 为i 到本身簇的距离平均值。最终计算出所有的样本点的轮廓系数平均值
6.2 轮廓系数值分析
- 分析过程(我们以一个蓝1点为例)
- 1、计算出蓝1离本身族群所有点的距离的平均值a_i
- 2、蓝1到其它两个族群的距离计算出平均值红平均,绿平均,取最小的那个距离作为b_i
- 根据公式:极端值考虑:如果b_i >>a_i: 那么公式结果趋近于1;如果a_i>>>b_i: 那么公式结果趋近于-1
6.3 结论
如果b_i>>a_i:趋近于1效果越好, b_i<<a_i:趋近于-1,效果不好。轮廓系数的值是介于 [-1,1] ,越趋近于1代表内聚度和分离度都相对较优。
6.4 轮廓系数 API
- sklearn.metrics.silhouette_score(X, labels)
- 计算所有样本的平均轮廓系数
- X:特征值
- labels:被聚类标记的目标值
6.5 用户聚类结果评估
1 |
|
7、K-means总结
- 特点分析:采用迭代式算法,直观易懂并且非常实用
- 缺点:容易收敛到局部最优解(多次聚类)
注意:聚类一般做在分类之前