1.人工智能机器学习深度学习的关系

在这里插入图片描述机器学习可以做什么。
在这里插入图片描述
学习的书籍推荐
在这里插入图片描述学习目标
在这里插入图片描述

2. 什么是机器学习

机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从历史数据当中获得规律?这些历史数据是怎么的格式?

3. 数据集的结构

1. 可用的数据集
在这里插入图片描述

2. 数据集结构
在这里插入图片描述特征值就是房子的面积、位置、楼层、朝向;目标值就是房价。

数据中对于特征处理两个包:
1.pandas:一个数据读取非常方便以及基本的处理格式的工具;
2.sklearn:对于特征的处理提供了强大的接口

4. 数据的特征工程

1. 特征工程是什么

       特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性
在这里插入图片描述

2. 特征工程的意义

       直接影响预测结果

3.Scikit-learn库介绍
在这里插入图片描述
在这里插入图片描述

5. 数据的特征抽取

       特征值化是为了计算机更好的去理解数据
       现实世界中多数特征都不是连续变量,比如分类、文字、图像等,为了对非连续变量做特征表述,需要对这些特征做数学化表述,因此就用到了特征提取. sklearn.feature_extraction提供了特征提取的很多方法。

1. 字典特征抽取

我们将城市和环境作为字典数据,来进行特征的提取。

sklearn.feature_extraction.DictVectorizer(sparse = True)

将映射列表转换为Numpy数组或scipy.sparse矩阵(sparse 是否转换为scipy.sparse矩阵表示,默认开启)。
在这里插入图片描述在这里插入图片描述
代码:

from sklearn.feature_extraction import DictVectorizer
dic = DictVectorizer(sparse=True) 
instances = [{'city': '北京','temperature':100},{'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
X = dic.fit_transform(instances)
print('fit_transform的结果:')
print(X)
print('inverse_transform的结果:')
print(dic.inverse_transform(X))

结果:
在这里插入图片描述因为DictVectorizer参数sparse=True设置,所以X是一个sparse矩阵。而使inverse_transform就是将X转换为原来的字典类型,只是多了一个数字标签。

若将sparse设置为False。
结果:
在这里插入图片描述       此时,fit_transform函数返回的是numpy数组,也即,X是一个numpy数组。对比两个数组,可以看到numpy数组和sparse数组的两者关系是,sparse数组是将numpy数组中非零的元素单独的选择出来,比如第0行第1列的1,以及第0行第3列的100,还有第2行第3列的30等。(我们一般都是转为numpy数组,sparse比较少用)。

       通过这个numpy数组可以看到,字典特征提取的原理就是,将字符类转换成机器能识别的数字,而数字不变。
在这里插入图片描述

2. 文本特征抽取

对文本数据进行特征值化

       文本的特征提取应用于很多方面,比如说文档分类、垃圾邮件分类和新闻分类。那么文本分类是通过词是否存在、以及词的概率(重要性)来表示。

(1)文档的中词的出现
数值为1表示词表中的这个词出现,为0表示未出现

sklearn.feature_extraction.text.CountVectorizer()

将文本文档的集合转换为计数矩阵(scipy.sparse matrices)
在这里插入图片描述在这里插入图片描述代码:

英文文本

from sklearn.feature_extraction.text import CountVectorizer
content = ["life is short,i like python","life is too long,i dislike python"]
verctor = CountVectorizer()
res = verctor.fit_transform(content)
print(verctor.get_feature_names())
res = res.toarray()  #将sparse数组转为numpy数组
print(res)

结果:

在这里插入图片描述若将列表中的第一个字符串增加一个单词is ,则就有两个is。看看结果如何:

在这里插入图片描述
可以看到数组第0行第1个元素由1变成2了。可以看出数组的每一行分别统计每一个字符串中出现的单词个数(单字母除外)。get_feature_names列举content中所有出现的单词(单个字母的除外)。

中文文本
content中的字符串是中文会如何:
代码:

from sklearn.feature_extraction.text import CountVectorizer
content = ["生活很短,我喜欢python","生活太久了,我不喜欢python"]
verctor = CountVectorizer()
res = verctor.fit_transform(content)
print(verctor.get_feature_names())
res = res.toarray()
print(res)

结果:
在这里插入图片描述
可以看到,中文文本并不能和英文文本那样很好的将每一个单词分开,这是因为英文句子中都有空格间隔的。若将中文文本也用空格隔开。

from sklearn.feature_extraction.text import CountVectorizer
content = ["生活 很短,我 喜欢python","生活 太久了,我不 喜欢python"]
verctor = CountVectorizer()
res = verctor.fit_transform(content)
print(verctor.get_feature_names())
res = res.toarray()
print(res)

结果:

['喜欢python', '太久了', '很短', '我不', '生活']
[[1 0 1 0 1]
 [1 1 0 1 1]]

可以看到用空格分开的可以很好的分离开,而且单个中文字也不统计。

       若要对中文文本进行特征抽取,则需要对中文进行分词才能详细的进行特征值化需要用到一个包:jieba分词
在这里插入图片描述

import jieba
a = jieba.cut('我是一个好程序员')
print(a)
for i in a:
    print(i)

结果:
在这里插入图片描述
代码

import jieba
def cut_word(str1,str2,str3):
    """jieba分词"""
    
    c1 = jieba.cut(str1)
    c2 = jieba.cut(str2)
    c3 = jieba.cut(str3)
    c1 = list(c1)
    c2 = list(c2)
    c3 = list(c3)
    
    return c1, c2, c3


cont1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
cont2 = "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
cont3 = "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"


c1,c2,c3 = cut_word(cont1,cont2,cont3)
print(c1)
print(c2)
print(c3)

结果:

['今天', '很', '残酷', ',', '明天', '更', '残酷', ',', '后天', '很', '美好', ',', '但', '绝对', '大部分', '是', '死', '在', '明天', '晚上', ',', '所以', '每个', '人', '不要', '放弃', '今天', '。']
['我们', '看到', '的', '从', '很', '远', '星系', '来', '的', '光是在', '几百万年', '之前', '发出', '的', ',', '这样', '当', '我们', '看到', '宇宙', '时', ',', '我们', '是', '在', '看', '它', '的', '过去', '。']
['如果', '只用', '一种', '方式', '了解', '某样', '事物', ',', '你', '就', '不会', '真正', '了解', '它', '。', '了解', '事物', '真正', '含义', '的', '秘密', '取决于', '如何', '将', '其', '与', '我们', '所', '了解', '的', '事物', '相', '联系', '。']

python中的join函数:

c1,c2,c3 = cut_word(cont1,cont2,cont3)

# Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
s1 = '*'.join(c1) #用*连接
s2 = ' '.join(c1) #用空格连接
print(s1)
print(s2)

结果
在这里插入图片描述
中文文本特征抽取完整代码

import jieba
def cut_word(str1,str2,str3):
    """jieba分词"""
    
    c1 = jieba.cut(str1)
    c2 = jieba.cut(str2)
    c3 = jieba.cut(str3)
    c1 = list(c1)
    c2 = list(c2)
    c3 = list(c3)
    
    return c1, c2, c3


cont1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
cont2 = "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
cont3 = "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"


c1,c2,c3 = cut_word(cont1,cont2,cont3)

# Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
c1 = ' '.join(c1) #用空格连接
c2 = ' '.join(c2) #用空格连接
c3 = ' '.join(c3) #用空格连接

from sklearn.feature_extraction.text import CountVectorizer
content = [c1, c2, c3]
verctor = CountVectorizer()
res = verctor.fit_transform(content)
print(verctor.get_feature_names())
res = res.toarray()
print(res)

结果:
在这里插入图片描述
       文本特征抽取中CountVectorizer是统计每一个单词出现的次数,如果在文本分类中,这样并不能达到用于分类的效果,因为每一篇文章中都会有一些经常使用的中性词,比如,我们、明天、现在等等。这种词语在每一篇文章中都会出现的次数很高,如果将两篇不同类型的文章因为这些中性词语相同而划分为一类显然是错误的,所以CountVectorizer并不常用,相对于他,TfidfVectorizer更为常用。

TF-IDF

在这里插入图片描述其中,tf是term frequency:词的频率,这一部分和CountVectorizer一样是用来统计词的频率,idf:逆⽂文档频率inverse document frequency ,它是等于log(总⽂文档数量量/该词出现的⽂文档数量量),而TF-IDF
是将词的频率乘以log(总⽂文档数量量/该词出现的⽂文档数量量),得出来的就是该单词对于一篇文章的重要性。
在这里插入图片描述代码

import jieba
def cut_word(str1,str2,str3):
    """jieba分词"""
    
    c1 = jieba.cut(str1)
    c2 = jieba.cut(str2)
    c3 = jieba.cut(str3)
    c1 = list(c1)
    c2 = list(c2)
    c3 = list(c3)
    
    return c1, c2, c3


cont1 = "今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。"
cont2 = "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。"
cont3 = "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"


c1,c2,c3 = cut_word(cont1,cont2,cont3)

# Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
c1 = ' '.join(c1) #用空格连接
c2 = ' '.join(c2) #用空格连接
c3 = ' '.join(c3) #用空格连接

from sklearn.feature_extraction.text import TfidfVectorizer
content = [c1, c2, c3]
tf = TfidfVectorizer()
res = tf.fit_transform(content)
print(tf.get_feature_names())
res = res.toarray()
print(res)

结果:

['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '这样']
[[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 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.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]

更多推荐