3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第1张图片
  • 1.数据集的介绍
  • 字典特征抽取
  • 文本特征提取
    • 1.根据词频
    • 2.根据词的重要性
  • 特征预处理
    • 1.归一化
    • 标准化
  • 特征降维
    • Filter过滤式:低方差过滤法
    • PCA降维

机器学习第一天

基础不牢,地动山摇。直接上手tf,连很多机器学习的基础包都不会使用。比如sklearn, pandas (使用sklearn 来做特征工程 , pandas 用于数据的清洗和数据的处理)这些数据处理库,因此回去回炉重造,学习机器学习先。 学习的视频是黑马程序员的机器学习视频。

视频和资料链接 提取码:1234

本篇文章内容:

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第2张图片

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第3张图片

开发流程

  • 1)获取数据
  • 2)数据处理
  • 3)特征工程
  • 4)机器学习算法训练 - 模型
  • 5)模型评估
  • 6)应用

第一天内容主要讲了前3项内容。使用sklearn完成一系列数据处理的工作。

1.数据集的介绍

sklearn 包中包含了很多数据集。比如波士顿的房价信息,鸢尾花数据集等等。小数据集,下载sklearn的时候也顺带下载了,如果是大数据集还需要另外去下载。

1.sklearn.datasets

  • load* 获取小规模数据集 已经保存到了本地
  • fetch_* 获取大规模数据集 还需要从网上下载这个数据集

数据集是以字典的方式返回的,所以调用数据的时候可以有两种调用方式。 1)dict["key"] = values

2)dict.key = values

学习任何一个深度学习视频都知道,有了数据,需要将数据分成训练集和测试集。 sklearn中使用train_split将数据集分开: sklearn.model_selection.train_split(array, *options)

x:数据集的特征值

y:数据集的标签值

test_size 测试集的大小,一般为float

random_state 随机数种子

return 训练集特征值(x_train),测试纸的特征值(x_test),训练集的目标值(y_train),测试集的目标值(y_test)

def datasets_demo():
    """
    sklearn数据集使用
    :return:
    """
    # 获取数据集
    iris = load_iris()
    print("鸢尾花数据集:n", iris)
    print("查看数据集描述:n", iris["DESCR"])
    print("查看特征值的名字:n", iris.feature_names)
    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

输出结果:iris数据集内容,DESCR描述,feature,data.shape

字典特征抽取

提取特征的步骤:

  • 1.实例化sklearn功能函数
  • 2.调用fit_transform(数据的根据实例化函数的功能,对数据进行响应的处理。)
  • 3.print
def dict_demo():
   """
   字典特征抽取
   :return:
   """
   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(), type(data_new))
   print("特征名字:n", transfer.get_feature_names())

   return None

输出

data_new:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]] 
特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']

这种方式的输出有很多0(即冗余),因此我们通常使用sparse参数,只输出有数值部分的坐标。

    transfer = DictVectorizer(sparse=True)

输出

data_new:
   (0, 1) 1.0
  (0, 3) 100.0
  (1, 0) 1.0
  (1, 3) 60.0
  (2, 2) 1.0
  (2, 3) 30.0 
特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']

文本特征提取

1.根据词频

英文文本特征提取

使用sklearn.feature_extraction.text的CountVectorizer。 调用方式同上:

def count_demo():
    """
    文本特征抽取:CountVecotrizer
    :return:
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["is", "too"])

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:n", data_new.toarray())
    print("特征名字:n", transfer.get_feature_names())

    return None

CountVectorizer(stop_words=["is", "too"])通过stop_words 可以去除统计一些word的词频。

输出

data_new:
 [[0 1 2 0 1 1]
 [1 1 0 1 1 0]]
特征名字:
 ['dislike', 'life', 'like', 'long', 'python', 'short']

中文本文特征提取

这个是通过空格来区分单词,对于中文而言,单词间就没有空格,因此需要多一步操作。这里调用一个能够分词的库: jieba

import jieba

def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    """
    return " ".join(list(jieba.cut(text)))
    #join函数,就是将text中文本加入空格。

#中文特征提取代码
def count_chinese_demo2():
    """
    中文文本特征抽取,自动分词
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:n", data_final.toarray())
    print("特征名字:n", transfer.get_feature_names())

    return None

2.根据词的重要性

如何判断一篇文章在说什么? 没错,就是 关键词! 在谷歌之前的搜索,都是通过一篇文章中,词的出现频率来对结果进行搜索排序。谷歌搜索的创新就是在于将引用最多的文章放到最前面。所以并不是说一个单词出现的频率越高这个单词就越重要。应该是这篇文章有,而其他文章没有的单词,这个才更有 辨识度

在sklearn库中,TfidfVectorzer负责这个功能(这个函数比前面根据词频的函数用的更多)

def tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    transfer = TfidfVectorizer(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:n", data_final.toarray())
    print("特征名字:n", transfer.get_feature_names())

    return None

特征预处理

1.归一化

为了有一个量纲,不要让一些数值小的参数被数值大的参数所掩盖,所以我们使用归一化处理,让大家在同一起跑线。 计算公式: mx,mi是你指定区间的数值大小。

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第4张图片

读入数据使用Pandas的read_csv()函数。 归一化的函数

def minmax_demo():
    """
    归一化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3] #只取数据的前三列数据
    print("data:n", data)

    # 2、实例化一个转换器类
    transfer = MinMaxScaler(feature_range=[2, 3])

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:n", data_new)

    return None

标准化

归一化的缺点:如果有几个数值异常,那么就会影响整个归一化矩阵。所以引入了标准化
  • 定义:原始数据转换成为均值为0,标准差为1的范围内

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第5张图片
  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

调用sklearn中的StandardScaler()函数

def stand_demo():
    """
    标准化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3]
    print("data:n", data)

    # 2、实例化一个转换器类
    transfer = StandardScaler()

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:n", data_new)
    return None

特征降维

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第6张图片

降维:顾明思议,就是降低数据的维度(减少不重要的信息,加快处理的速度)

Filter过滤式:低方差过滤法

如果两个数据的方差很大,则这个数据有意义。

特征方差小:某个特征大多样本相近,那么这些数据就是冗余

特征=方差大:那么这些特征都有意义,需要保留。

最后如何去表达两遍参数之间的相关程度呢? 这里我们使用相关系数来表示两个变量的相关程度,公式如下

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第7张图片

比如我们的x,y如下图所示

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第8张图片

计算结果

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第9张图片

相关系数为+0.9942>0,因此x,y是呈现正相关。

  • r>0 两变量正相关,r<0两变量负相关
  • |r|=1 两变量完全相关,r=0无相关
  • |r|<0.4 低度相关,0.4<|r|<0.7显著性相关, |r|>0.7 高度线性相关。

计算相关性使用到了scipy库。 numpy,scipy的关系图:

3 dim 机器学习_黑马程序员3天入门机器学习Day1学习笔记_第10张图片

来自Python numpy,scipy,pandas这些库的区别是什么?

库的调用方法同上: 1)先实例化一个转换器类 2)调用fit_transform

from sklearn.feature_selectioarn.decomposition import PCA
from scipy.stats import pearsonr
def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2]
    print("data:n", data)

    # 2、实例化一个转换器类
    transfer = VarianceThreshold(threshold=10) #去除低方差数据

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:n", data_new, data_new.shape)

    # 计算某两个变量之间的相关系数
    r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print("相关系数:n", r1)

    r2 = pearsonr(data['revenue'], data['total_expense'])
    print("revenue与total_expense之间的相关性:n", r2)
    plt.figure(figsize=[20, 8], dpi=100)  # figsize 设定fig的长宽高
    plt.scatter(data['revenue'], data['total_expense'])
    plt.show()
    return None

PCA降维

降维中,PCA降维用的比较多,我觉得比较好的PCA讲解视频:中字 主成分分析法(PCA)| 分步步骤解析 看完你就懂了! PCA的原理比较复杂,这个视频我觉得讲的很通俗和清楚。如果只是想学一下如何调用就无需关系。看代码就行。 PCA降维代码

from sklearn.decomposition import PCA

def pca_demo():
    """
    PCA降维
    :return:
    """
    data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]

    # 1、实例化一个转换器类
    #n_components=小数, 表示保留百分之多少的信息
    #整数;减少到多少特征
    transfer = PCA(n_components=0.95)

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:n", data_new)
    return None

n_components=小数, 表示保留百分之多少的信息;若为整数;减少到多少特征

完,以上为Day1的内容。

你可能感兴趣的:(3,dim,机器学习)