机器学习—学习笔记#day01

机器学习

Posted by DiCaprio on July 3, 2019

目录

什么是机器学习

可用数据集

常用数据集数据的结构组成

特征工程是什么

特征工程的意义

sklearn特征抽取API

字典特征抽取

DictVectorizer语法

文本特征抽取

CountVectorizer语法

如何去对中文文本特征值化

TF-IDF

TfidfVectorizer语法

特征处理是什么

归一化

归一化公式计算过程

MinMaxScaler语法

为什么要进行归一化

问题:如果数据中异常点较多,会有什么影响?

归一化总结

标准化

结合归一化来谈标准化

StandardScaler语法

标准化总结

缺失值处理方法

Imputer语法

关于np.nan(np.NaN)

特征选择原因

特征选择是什么

VarianceThreshold语法

PCA(主成分分析)是什么

高维度数据容易出现的问题

通过公式计算(只做了解)

PCA语法


什么是机器学习

机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测

可用数据集

 

Kaggle网址:https://www.kaggle.com/datasets

UCI数据集网址: http://archive.ics.uci.edu/ml/

scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets

常用数据集数据的结构组成

特征工程是什么

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

特征工程的意义

直接影响模型的预测结果

sklearn特征抽取API

sklearn.feature_extraction

字典特征抽取

作用:对字典数据进行特征值化

类:sklearn.feature_extraction.DictVectorizer

DictVectorizer语法

DictVectorizer.fit_transform(X)      

X:字典或者包含字典的迭代器

返回值:返回sparse矩阵

DictVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前数据格式

DictVectorizer.get_feature_names()

返回类别名称

DictVectorizer.transform(X)

按照原先的标准转换

  1. from sklearn.feature_extraction import DictVectorizer
  2. def dictvec():
  3. """
  4. 字典数据抽取
  5. :return:
  6. """
  7. # 实例化
  8. dict = DictVectorizer(sparse=False)
  9. # 调用fit_transform把数据输入进去,直接转换成特征抽取之后的数据
  10. data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
  11. print(dict.get_feature_names())
  12. print(data)
  13. return None
  14. if __name__ == "__main__":
  15. dictvec()

文本特征抽取

作用:对文本数据进行特征值化

类:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer语法

CountVectorizer(max_df=1.0,min_df=1,)

返回词频矩阵

CountVectorizer.fit_transform(X,y)      

X:文本或者包含文本字符串的可迭代对象

返回值:返回sparse矩阵

CountVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前数据格式

CountVectorizer.get_feature_names()

返回值:单词列表

  1. def countvec():
  2. """
  3. 对文本进行特征值化
  4. :return:
  5. """
  6. cv = CountVectorizer()
  7. data = cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])
  8. print(cv.get_feature_names())
  9. print(data.toarray())
  10. return None
  11. if __name__ == "__main__":
  12. countvec()

如何去对中文文本特征值化

import jieba

jieba.cut(“我是一个好程序员”)

返回值:词语生成器

  1. def cutword():
  2. con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
  3. con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
  4. con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
  5. # print(type(con1)) <class 'generator'>
  6. # 转换成列表
  7. content1 = list(con1)
  8. content2 = list(con2)
  9. content3 = list(con3)
  10. # 把列表转换成空格隔开字符串
  11. c1 = ' '.join(content1)
  12. c2 = ' '.join(content2)
  13. c3 = ' '.join(content3)
  14. return c1, c2, c3
  15. def hanzivec():
  16. """
  17. 中文特征值化
  18. :return: None
  19. """
  20. c1, c2, c3 = cutword()
  21. print(c1, c2, c3)
  22. cv = CountVectorizer()
  23. data = cv.fit_transform([c1, c2, c3])
  24. print(cv.get_feature_names())
  25. print(data.toarray())
  26. return None
  27. if __name__ == "__main__":
  28. hanzivec()

TF-IDF

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度

类:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer语法

TfidfVectorizer(stop_words=None,)

返回词的权重矩阵

TfidfVectorizer.fit_transform(X,y)      

X:文本或者包含文本字符串的可迭代对象

返回值:返回sparse矩阵

TfidfVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前数据格式

TfidfVectorizer.get_feature_names()

返回值:单词列表

  1. def tfidfvec():
  2. """
  3. 中文特征值化
  4. :return: None
  5. """
  6. c1, c2, c3 = cutword()
  7. print(c1, c2, c3)
  8. tf = TfidfVectorizer()
  9. data = tf.fit_transform([c1, c2, c3])
  10. print(tf.get_feature_names())
  11. print(data.toarray())
  12. return None
  13. if __name__ == "__main__":
  14. tfidfvec()

特征处理是什么

通过特定的统计方法(数学方法)数据转换成算法要求的数据

数值型数据:标准缩放:

1、归一化

2、标准化

3、缺失值

类别型数据:one-hot编码

时间类型:时间的切分

归一化

特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

归一化公式计算过程

sklearn归一化API:  sklearn.preprocessing.MinMaxScaler

MinMaxScaler语法

MinMaxScalar(feature_range=(0,1))

每个特征缩放到给定范围(默认[0,1])

MinMaxScalar.fit_transform(X)      

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

  1. def mm():
  2. """
  3. 归一化处理
  4. :return: None
  5. """
  6. mm = MinMaxScaler(feature_range=(2, 3)) # 默认0-1范围
  7. data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
  8. print(data)
  9. return None
  10. if __name__ == "__main__":
  11. mm()

为什么要进行归一化

问题:如果数据中异常点较多,会有什么影响?

归一化总结

注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性(稳定性)较差,只适合传统精确小数据场景

标准化

1、特点:通过对原始数据进行变换把数据变换到均值为0,方差为1范围内

方差越小点越密集,数据越稳定,当方差=0,所有数据都相等

结合归一化来谈标准化

sklearn特征化API:  scikit-learn.preprocessing.StandardScaler

StandardScaler语法

StandardScaler()

处理之后每列来说所有数据都聚集在均值0附近方差为1

StandardScaler.fit_transform(X,y)      

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

StandardScaler.mean_

原始数据中每列特征的平均值

StandardScaler.std_

原始数据每列特征的方差

  1. def stand():
  2. """
  3. 标准化缩放
  4. :return:
  5. """
  6. std = StandardScaler()
  7. data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
  8. print(data)
  9. return None
  10. if __name__ == "__main__":
  11. stand()

标准化总结

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

缺失值处理方法

Imputer语法

Imputer(missing_values='NaN'strategy='mean'axis=0)

完成缺失值插补

Imputer.fit_transform(X,y)      

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

  1. def im():
  2. """
  3. 缺失值处理
  4. :return:NOne
  5. """
  6. # NaN, nan
  7. im = Imputer(missing_values='NaN', strategy='mean') # 使用Imputer则参数可以是np.nan或者'NaN'
  8. im2 = SimpleImputer(missing_values=np.nan, strategy='mean') # 使用SimpleImputer则参数必须是np.nan,否则报错
  9. data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
  10. data2 = im2.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
  11. print(data)
  12. print(data2)
  13. return None
  14. if __name__ == "__main__":
  15. im()

关于np.nan(np.NaN)

1 numpy的数组中可以使用np.nan/np.NaN来代替缺失值属于float类型

2、如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可

特征选择原因

冗余:部分特征的相关度高,容易消耗计算性能

噪声:部分特征对预测结果有负影响

特征选择是什么

特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。

主要方法(三大武器):

Filter(过滤式):VarianceThreshold

Embedded(嵌入式):正则化、决策树

Wrapper(包裹式)

VarianceThreshold语法

VarianceThreshold(threshold = 0.0)

删除所有低方差特征

Variance.fit_transform(X,y)      

X:numpy array格式的数据[n_samples,n_features]

返回值:训练集差异低于threshold的特征将被删除。

默认值是保留所有非零方差特征,即删除所有样本

中具有相同值的特征。

  1. def var():
  2. """
  3. 特征选择-删除低方差的特征
  4. :return: None
  5. """
  6. var = VarianceThreshold(threshold=1.0)
  7. data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
  8. print(data)
  9. return None
  10. if __name__ == "__main__":
  11. var()

PCA(主成分分析)是什么

本质:PCA是一种分析、简化数据集的技术

目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

作用:可以削减回归分析或者聚类分析中特征的数量

高维度数据容易出现的问题

特征之间通常是线性相关的

     

二维简化成一维,且数据不减少

通过公式计算(只做了解)

PCA语法

PCA(n_components=None)

将数据分解为较低维数空间

PCA.fit_transform(X)      

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后指定维度array

  1. def pca():
  2. """
  3. 主成分分析进行特征降维
  4. :return: None
  5. """
  6. pca = PCA(n_components=0.9)
  7. data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
  8. print(data)
  9. return None
  10. if __name__ == "__main__":
  11. pca()

                            </div>