Python 机器学习(笔记)

视频地址:Bilibili,推荐使用 Pycharm ,方便看源码

文章所用数学公式生成地址:Latex Editor,生成后使用 QQ 截图复制到 CSDN 编辑器
Latex 参考教程:csdn

1 机器学习概述

1.1 机器学习

从数据中自动分析获得模型,并利用模型对未知数据进行预测

数据集:特征值+目标值

  • 每一行数据可以作为一个样本
  • 有些数据集可以没有目标值

1.2 机器学习算法分类

  • 监督学习:
      目标值:类别——分类问题

  KNN、贝叶斯、决策树、随机森林、逻辑回归

  目标值:连续性的数据——回归问题

  线性回归、岭回归

  • 无监督学习:无目标值

  聚类:k-means

1.3 开发流程

获取数据 => 数据处理 => 特征工程 => 模型训练 => 模型评估 => 应用

1.4 框架

sklearn、tensorflow、caffe2、chainer、theano、pytorch

1.5 数据集

数据集=测试集+训练集

可用数据集:

  • Scikit-Learn:数据量小,学习方便
  • Kaggle:大数据竞赛平台、80万科学家、真实数据、数据量大
  • UCI:360个数据集包含科学、生活、经济

基本使用方法

load_db() 加载较小的数据集
fetch_db() 加载较大的数据集

  • db 表示某个数据集,返回值是 Bunch (Dict),可以通过 . 来访问

例如加载 iris 数据集

from sklearn.datasets import  load_iris
iris=load_iris()
print(iris.data)
print(iris["target_name"]

1.6 数据集划分

sklearn.model_selection.train_test_split(x,y,test_size,radom_state,……)
  • x:数据集特征值
  • y:数据集标签值
  • test_size:测试集大小,float
  • radom_state:随机数种子
  • return:训练集特征值、测试集特征值、训练集目标值、测试集目标值

示例

from sklearn.datasets import  load_iris
from sklearn.model_selection import train_test_split

iris=load_iris()
x_train,y_train,x_test,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
print(x_train.shape)

2 特征工程

特征工程(Feature Engineering)是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。

  • 数据和特征决定了机器学习的上限,模型和算法只是逼近这个上限而已

pandas 数据清洗、数据处理
sklearn 特征工程

特征工程包括:特征抽取、特征预处理、特征降维

2.1 特征抽取

将任意数据(文本或图像)转换为可用于机器学习的数字特征,分为:字典特征提取、文本特征提取、图像特征提取

sklearn.feature_extraction

2.1.1 字典特征提取

类别 -> one-hot 编码(独热编码)

  • one-hot 编码 :将 离散的 的分类特征转为可用于距离计算的、或神经网络可处理的数据类型,具体请看 独热编码
sklearn.feature_extraction.DicVectorize(sparse=True)
  • DicVectorizer.fit_transform(X) : X 字典或包含字典的迭代器返回值:返回 sparse 矩阵 (稀疏矩阵)
  • DicVectorizer.inverse_transform(X) : X : array 数组或者 sparse 矩阵:返回转换前的数据格式
  • DicVectorizer.get_feature_names() : 返回类别名称

示例

    data=[{'city':'beijing','temperature':'40'},{'city':'shanghai','temperature':'38'},{'city':'shenzhen','temperature':'36'}]
    from sklearn.feature_extraction import DictVectorizer
    transfer=DictVectorizer(sparse=False)#实例化转换类
    data_new = transfer.fit_transform(data)
    print(data_new)

sparse => 稀疏矩阵:将非零值表示出来,在类别很多的时候使用,节省内存,提高加载效率

指定 sparse=True ,则返回一个稀疏矩阵,否则返回一个正常大小的矩阵
在这里插入图片描述
这是因为,在该类中,执行了 toarray() 方法,对于任何返回值为稀疏矩阵的方法,可以使用 toarray() 转换为正常矩阵

if self.sparse:
   result_matrix.sort_indices()
else:
   result_matrix = result_matrix.toarray()

字典特征的应用场景:

  • 数据集中类别特征比较多:数据集特征 => 字典 => DicVectorizer 转换
  • 数据本身就是字典

2.1.2 文本特征提取

单词作为特征

  1. CountVectorizer
    统计每个样本特征词出现的个数
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

返回词频矩阵
CountVectorizer.fit_transform(X) X : 文本或包含文本的可迭代对象,返回值:sparse 矩阵
CountVectorizer.get_feature_names() 返回值:单词列表

示例

from sklearn.feature_extraction.text import CountVectorizer
data=['life is short, i like like python','life is too long, i dislike python']
transfer=CountVectorizer()
data_new =  transfer.fit_transform(data)
print(data_new)
print(data_new.toarray())
print(transfer.get_feature_names())

[[0 1 1 0 2 0 1 1 0]
[1 2 0 1 0 1 1 0 1]]

参数:stop_words=[] 停用词:不将 stop_words 中的词语作为特征

data=['lief is short, i like like python','life is too long, is dislike python']
transfer=CountVectorizer()
transfer = CountVectorizer(stop_words=['is', 'too'])
data_new=transfer.fit_transform(data)
print(data_new.toarray())

[[0 1 0 2 0 1 1]
[1 0 1 0 1 1 0]]

中文文本特征提取

from sklearn.feature_extraction.text import CountVectorizer
#data = ['我爱北京天安门', '天安门上太阳升']
data = ['我 爱 北京 天安门', '天安门 上 太阳 升']
transfer = CountVectorizer()
data_new = transfer.fit_transform(data)
print(data_new)
print(data_new.toarray())
print(transfer.get_feature_names())

使用库 jieba 对中文文本进行分词

#pip install jieba
import jieba

def cut_word(text):
    '''
    进行中文分词:“我爱北京天安门” => “我 爱 北京 天安门”
    :return: 
    '''
    return " ".join(list(jieba.cut(text)))

def count_chinese():
    '''
    中文文本特征抽取,自动分词
    :return:
    '''

    data=['今天狠残酷,明天更残酷,后天很美好但绝对大郎分是死在明天晚上,所以每个人不要放弃今天.',
          '我们看到的从很远星系来的光是在几百万年之前发出的这样当我们看到宇宙时,我们是在看它的过去.',
          '如果只用一种方式了解某样事物,你就不会真正了解它了辉事物真正含义的秘密取决于如何将其与我们所了解的平物相联系.']
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent))
    transfer=CountVectorizer(stop_words=['一种','如果','所以'])
    data1=transfer.fit_transform(data_new)
    print("稀疏矩阵\n" + str(data1))
    print("常规矩阵\n" + str(data1.toarray()))
    print(transfer.get_feature_names())


  1. 关键词作为特征:TfidfVectorizer

关键词:在某一个类别的文章中,出现的次数很多,但是在其它类别的文章中出现很少

TF-IDF的主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。.
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度

词频(term frequency , tf):某个给定词在文章中出现的频率,即

在这里插入图片描述

逆向文档频率(inverse document frequency , idf):一个词的普遍重要性的度量。总的文章数目除以包含该词语的文章的数目,在取 lg 对数,即
在这里插入图片描述

TF-IDF:描述了某个词的重要程度
在这里插入图片描述

例如:

题目1:请分析两个词语“经济”、“科技”对一系列文章的重要性。已知总共有 1000 篇文章,10 篇文章中出现过 “经济”,100 篇文章中出现过 “科技”。文章A(100词)出现了10次“经济”,文章B(100词)出现了10次“科技”。请分别计算 2 篇文章的 TF-IDF 值。

对于文章 A:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于文章B:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
综上有
在这里插入图片描述
因此,可以说,对于这1000篇文章来说,经济这个词重要程度大于科技

sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])

返回词的权重矩阵
TfidfVectorizer.fit_transform(X) X : 文本或包含文本的可迭代对象,返回值:sparse 矩阵
TfidfVectorizer.get_feature_names() 返回值:单词列表

def tfidf_demo():
    '''
    使用tf-df的方法进行文本特征提取
    :return:
    '''
    data = ['今天狠残酷,明天更残酷,后天很美好但绝对大郎分是死在明天晚上,所以每个人不要放弃今天.',
            '我们看到的从很远星系来的光是在几百万年之前发出的这样当我们看到宇宙时,我们是在看它的过去.',
            '如果只用一种方式了解某样事物,你就不会真正了解它了辉事物真正含义的秘密取决于如何将其与我们所了解的平物相联系.']
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    transfer = TfidfVectorizer()
    data1 = transfer.fit_transform(data_new)
    print("稀疏矩阵\n" + str(data1))
    print("常规矩阵\n" + str(data1.toarray()))
    print(transfer.get_feature_names())

[[0. 0. 0.21821789 0. 0. 0.
0.43643578 0. 0. 0. 0. 0.
0.21821789 0. 0.21821789 0. 0. 0.
0. 0. 0.21821789 0.21821789 0. 0.43643578
0. 0.21821789 0. 0.43643578 0.21821789 0.
0. 0. 0.21821789 0.21821789 0. 0.
0. ] [0. 0. 0. 0.2410822 0. 0.
0. 0.2410822 0.2410822 0.2410822 0. 0.
0. 0. 0. 0. 0. 0.2410822
0. 0.55004769 0. 0. 0. 0.
0.2410822 0. 0. 0. 0. 0.48216441
0. 0. 0. 0. 0. 0.2410822
0.2410822 ] [0.18387076 0.18387076 0. 0. 0.55161227 0.36774151
0. 0. 0. 0. 0.18387076 0.18387076
0. 0.18387076 0. 0.18387076 0.18387076 0.
0.18387076 0.13983845 0. 0. 0.18387076 0.
0. 0. 0.18387076 0. 0. 0.
0.36774151 0.18387076 0. 0. 0.18387076 0.
0. ]]
[‘一种’, ‘不会’, ‘不要’, ‘之前’, ‘了解’, ‘事物’, ‘今天’, ‘光是在’, ‘几百万年’, ‘发出’, ‘取决于’, ‘只用’, ‘后天’, ‘含义’, ‘大郎分’, ‘如何’, ‘如果’, ‘宇宙’, ‘平物’,‘我们’, ‘所以’, ‘放弃’, ‘方式’, ‘明天’, ‘星系’, ‘晚上’, ‘某样’, ‘残酷’, ‘每个’, ‘看到’,‘真正’, ‘秘密’, ‘绝对’, ‘美好’, ‘联系’, ‘过去’, ‘这样’]

2.2 特征预处理

通过转换函数将特征数据转换成更加适合算法模型的特征的过程
在这里插入图片描述

主要内容:归一化、标准化

将特征归一化和标准化的原因:特征的单位或者大小相差较大,或者某特征的方差相比其他特征要大几个数量级、会影响目标结果,使得一些算法无法学习到其它特征。

2.2.1 归一化

对原始数据进行变换把数据映射到 [0,1],即
在这里插入图片描述
其中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

sklearn.preprocessing.MinMaxScaler(feature_range=(0,1))
  • MinMaxScaler.fit_transform(X) X: numpy array 格式的数据 [n_samples,n_features]
  • 返回值:转换后相同形状的 array

dating.txt 下载地址

def minmax_demo():
    '''
    归一化
    :return:
    '''
    # 1.获取数据
    # 2.实例化一个转换器类
    # 3. 调用 fit_transform
    data=pd.read_csv('dating.txt')
    data=data.iloc[:,:3]#所有行、前三列
    transfer=MinMaxScaler(feature_range=[0,1])
    data_new=transfer.fit_transform(data)
    print(data_new)

归一化缺点:最大值、最小值是变化的,且容易受到异常值影响,鲁棒性较差,只适合传统精确小数据场景
在这里插入图片描述

2.2.1 标准化

将原始数据转换到均值为 0 ,标准差为 1 的范围内

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标准差:集中程度
在这里插入图片描述

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
sklearn.preprocessing.StandardScaler()
  • StandardScaler.fit_transform(X) X: numpy array 格式的数据 [n_samples,n_features]
  • 返回值:转换后相同形状的 array
def stand_demo():
    '''
    标准化
    :return:
    '''
    # 1.获取数据
    # 2.实例化一个转换器类
    # 3. 调用 fit_transform
    data=pd.read_csv('dating.txt')
    data=data.iloc[:,:3]#所有行、前三列
    transfer=StandardScaler()
    data_new=transfer.fit_transform(data)
    print(data_new)

[[ 0.33193158 0.41660188 0.24523407]
[-0.87247784 0.13992897 1.69385734]
[-0.34554872 -1.20667094 -0.05422437]

[-0.32171752 0.96431572 0.06952649]
[ 0.65959911 0.60699509 -0.20931587]
[ 0.46120328 0.31183342 1.00680598]]

标准化更适用于大数据

2.3 特征降维

降低特征的个数

两种方法:特征选择、主成分分析

2.3.1 特征选择

从原有特征中找出主要特征
方法:Filter(过滤式), Embedded(嵌入式)

  1. Filter
  • 方差选择法
  • 相关系数
  1. Embedded
  • 决策树
  • 正则化
  • 深度学习:卷积
sklearn.feature_selection

方差选择法

  1. 低方差特征过滤
sklearn.feature_selection.VarianceThreshold(threshold=0.0)
  • 删除所有低方差特征
    Variance.fit_transform(X)
  • X: numpy array 格式的数据 [n_samples,n_features]
  • 返回值:训练值差异低于 threshold 的特征将被删除,默认值是保留所有非零方差特征,即删除所有样本中具有相同值得特征。

factor_returns.csv 下载地址

def variance_demo():
    '''
    过滤低方差特征
    :return:
    '''
    data=pd.read_csv('factor_returns.csv')
    data=data.iloc[:,1:-2]
    transfer=VarianceThreshold(threshold=10)
    data_new=transfer.fit_transform(data)
    print(data.shape)
    print(data_new.shape)

相关系数
皮尔逊相关系数 (Pearson Correlation Coefficient, PCC)

  • 反映变量之间相关关系密切程度的统计指标

在这里插入图片描述
例如:年广告投入与月平均销售额关系
在这里插入图片描述
特点:在这里插入图片描述

  • r > 0 正相关,r <0 负相关
  • | r | =1 完全相关,r=0 无相关性
from scipy.stats import pearsonr
  • x:(N, ) array_like
  • y:(N, ) array_like
  • 返回值:(PCC,p-value)
pcc=pearsonr(data['pe_ratio'],data['pb_ratio'])
print(pcc)

(-0.004389322779936271, 0.8327205496564927)

画图看相关性

pcc = pearsonr(data['revenue'], data['total_expense'])
print(pcc)
plt.figure(figsize=(10,8),dpi=100)
plt.scatter(data['revenue'],data['total_expense'])
plt.show()

(0.9958450413136115, 0.0)

在这里插入图片描述

2.3.2 主成分分析

高维数据转换为低维数据,该过程可能会舍弃原有数据,创造新的变量

  • 压缩数据维数,使得信息损失最少,用于回归分析或者聚类分析中

如 将二维的点 变为一维
在这里插入图片描述
对于上图来说,找到一条合适的直线,使得每个点到该线距离之和最小
在这里插入图片描述

sklearn.decomposition.PCA(n_components=None)
  • 将数据分解为较低维数空间
    n_components:
  • 小数:保留百分之多少的信息
  • 整数:减少到多少特征
  • 返回值:转换后指定维度的 array
def pca_demo():
    '''
    PCA 降维
    :return: 
    '''
    data=[[2,8,4,5],[6,3,0,8],[5,4,9,1]]
    transfer=PCA(n_components=2)
    data_new=transfer.fit_transform(data)
    print(data_new)
    transfer = PCA(n_components=0.95)
    data_new = transfer.fit_transform(data)
    print(data_new)

[[ 1.28620952e-15 3.82970843e+00] [ 5.74456265e+00 -1.91485422e+00] [-5.74456265e+00 -1.91485422e+00]]
[[ 1.28620952e-15 3.82970843e+00] [ 5.74456265e+00 -1.91485422e+00] [-5.74456265e+00 -1.91485422e+00]]

案例:找到用户与物品类别之间的关系
用户 物品类别
user_id aisle

过程:

  1. 将 user_id 与 aisle 放在同一个表中
  2. 找到 user_id 和 aisle
  3. 特征冗余过多 => PCA降维

数据:
总共四张表

aisles=pd.read_csv('instacart/aisles.csv')
order_products__prior=pd.read_csv('instacart/order_products__prior.csv')
orders=pd.read_csv('instacart/orders.csv')
products=pd.read_csv('instacart/products.csv')

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将四张表分别按照索引 aisle_id, product_id, order_id 合并,然后交叉表,最后得到
在这里插入图片描述
可以看到很零,造成信息冗余,可以使用 PCA 降维

transfer=PCA(0.95)
data_new=transfer.fit_transform(data)
data_new.shape
data_new

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chaoge_dgqb/article/details/108291991
今日推荐