机器学习1《特征工程,归一化与标准化》

机器学习的数据来源:

  1.大多以文件的形式储存,csv 等。

  2. 为什么不用数据库呢,因为会有瓶颈,可能30m 以上就不行了。

  3. 数据格式不匹配, 数据库格式是json,

  4. python有pandas库 运行速度快, 并且python的numpy库是 真正的多线程

数据集的组成:

  kaggle 特点:    1.大数据竞赛平台

          2.80万科学家, 真实数据

          3. 数据量巨大

  UCI 特点:     1.收录了360个数据集

            2.覆盖科学,生活,经济等邻域

            3.数据量几十万

  scikit-learn 特点: 数据量小, 方便学习

数据集的结构: 特征值+目标值

工具模块: pandas, sklearn

特征抽取

特征抽取:特征抽取对文本等数据的进行特征值话,

   类 :sklean.feature_extraction    特征抽取

        sklean.feature_extraction.DictVectorizer   字典数据特征值化

        DictVectorizer(sparse = Ture,...) 语法

          1.DictVectorizer.fit_transform(x)

              x:字典或保函字典的迭代器

              返回值:返回稀疏矩阵

          2.DictVectorizer.inverse_tansform(x)

              x: array数组,或者稀疏矩阵

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

          3.DictVectorizer.get_feature_name()

              返回类别名称

          4.DictVectorizer.tansform(x)

              按照原先的标准转换

        eg:字典数据抽取

 1 from sklearn.feature_extraction import DictVectorizer
 2 '''
 3 对字典数据特征抽取
 4 feature_extraction :特征抽取 
 5 vectorizer : 向量化
 6 
 7 '''
 8 
 9 def dictvec():
10     '''
11     字典数据抽取
12     return:spare矩阵 
13     '''
14     dictvectorize = DictVectorizer(sparse=False)    # spares 矩阵节约内存,spares 
15     data = [{'city': '北京', 'weather': 'rain day', 'temperature': 100},
16             {'city': '江西', 'weather': 'rain day', 'temperature': 200}]
17 
18     dictvec_data = dictvectorize.fit_transform(data)
19     print(dictvectorize.get_feature_names())
20     '''
21         ['city=北京', 'city=江西', 'temperature', 'weather=rain day']
22     '''
23     print(dictvec_data)
24     '''
25         [[  1.   0. 100.   1.]
26          [  0.   1. 200.   1.]]
27     '''
28     # 所以我们可以知道字典数据抽取是在干什么了: 把字典中一些类别数据,分别转换特征
29 
30 if __name__ == '__main__':
31     dictvec()
特征抽取字典

         文本抽取CountVecorizer

          1.CountVecorizer.fit_transform(x)

              取样 这里返回的值需要 x.toarray() 才会出现字典抽取里面spare=False的情况

          2.CountVectorizer.get_feature_name()

 1 from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer  # 对文本进行特征抽取
 2 def count_text():
 3     '''
 4     对文本进行特征抽取
 5 
 6     :return:None
 7     '''
 8     Cv = CountVectorizer()
 9     c1, c2 = cut_chinese()
10     resule = Cv.fit_transform([c1, c2])
11     print(Cv.get_feature_names())
12     print(resule.toarray())  # 将数据转化为矩阵
13     # 由此可见我们对文本进行特征抽取的时候,他会统计某个单词出现的次数(一个字母不统计)
14     '''
15     ['but', 'do', 'like', 'me', 'not', 'so', 'you']
16     [[1 1 2 1 1 0 2]
17      [0 1 1 1 0 1 1]]
18     '''
19     '''
20     但是对于中文来说,就不满足了,因为这个分类是需要按照空格来分类的,
21     当我们需要对中文分类时,就需要把中文加上空格的地方断开 jieba.cut('人生苦短,我用python')返回值为词语生成器
22     
23     '''
24     return None
对文本特征抽取

从以上代码来看,对单个字母来说是不会分析的,而且这里面的规则是按照空格来抽取,但是我们的汉字却没有空格,那么我们要对汉字或者汉字和英文的混合版进行特征抽取的适合就需要使用jieba这个库来自动的对我们的文本分类

import jieba
def cut_chinese():
    text1 = '可以看到成功获取到每个词的词性,这对于我们对分词结果做进一步处理很有帮助,比如只想获取分词结果列表中的名词,' 
            '那么就可以这样过滤'
    text2 = '所以很多地方很多时候生成了元组、列表、字典后,可以用 join() 来转化为字符串'
    c_text = jieba.cut(text1)
    c_text2 = jieba.cut(text2)
    cut_text =list(c_text)
    cut_text2 = list(c_text2)
    c1 = ' '.join(cut_text)
    c2 = ' '.join(cut_text2)
    return c1, c2
jieba 分词

但是现在需求来了,我们的CountVecorizer是对文本抽取,但是我却很难从里面获取信息,这个时候我们就需要Tfidf 来对文本进行特征抽取了

TfidfVectorizer  重要性(tf(词的频率) * idf(逆文档频率))  分类机器学习的重要依据
一个词在改文章出现频率较高,在其他文章出现频率较低说明该词或短语在有很好的类别区分能力,适合用来分类
这是tfidf的作用
def tf():
    zhongyaoxing = TfidfVectorizer()
    c1, c2 = cut_chinese()
    a = zhongyaoxing.fit_transform([c1, c2])
    print(zhongyaoxing.get_feature_names())
    print(a.toarray())

归一化与标准化

归一化 : 通过对原始数据进行变换,把数据映射到(0, 1)之间
X' = (x-min)/(max-min) X'' = X'*(mx - mi) + mi
注:作用于每一列,max为一列的最大值,min为一列的最小值, X''为最终结果, mx mi 分别为指点区间值默认mx为1 mi为0(缩小的范围默认缩小范围0到1之间)
三个特征同等重要的时候:进行归一化
目的: 不想让某一个特征不会对最终结果造成更大影响
缺点: 容易受异常点影响, 因为异常点会影响 最大最小值导致整个样本变化
所以归一化 是有局限性的
API : from sklearn.preprocessing import MinMaxScaler
MinMaxScaler(feature_range=(0,1)) feature_range() 缩小的范围
fit_transform

eg:
def guiyi():
    '''
    归一化
    :return:None
    '''
    guiyi = MinMaxScaler()
    x = guiyi.fit_transform([[14488, 7.153469, 1.693904],
                            [26052, 1.441871, 0.805124],
                            [75136, 13.146394, 0.428964]])
    print(x)
归一化


标准化: 归一化的改良(抗异常点的干扰性强)
API: from sklearn.preprocessing import StandardScaler
StandardScaler.fit_transform(X)
X: numpy array格式数据[n_samples, n_features]
返回值: 转换后的旋转相同的array
StandardScaler.mean_
原始数据中每列特征的平均值
StandardScaler.std_
原始数据没列特征的方差
要求: 具有一定的样本数量
特点: 通过对原始数据进行变换把数据换到均值为0方差为1的范围内
公式: X' = (x-mean)/σ σ:标准差
标准差是方差的算术平方根 方差(参考数据的稳定性)
方差 = (x1 - mean)^2 +(x2 - mean)^2 ...+(xn - mean)^2 /n

def biaozhun():
    '''
    标准化
    :return:None
    '''
    bz = StandardScaler()
    x = bz.fit_transform([[14488, 7.153469, 1.693904],
                            [26052, 1.441871, 0.805124],
                            [75136, 13.146394, 0.428964]])
    print(x)
    print(bz.mean_)  # 平均值
    print(bz.scale_)  # 标准差
标准化

对于遇到处理缺失值的时候

1.删除 : 如果每行数据或者每列数据缺失值达到一定的比例,建议放弃整行或者整列
2.插补 : 可以通过缺失值每行或者每列 的平均值,中位数来填充
API sklearn.preprocessing.Imputer
Imputer(missing_value='NaN', strategy='mean') 用平均值来填补
Imputer.fit_transform(X)
X : numpy.array数据格式[n_samples, n_features]
返回值: 转换后形状相同的array
eg:
[[1, 2],
[np.nan, 2],
[3,3]]

pandas:
dropna
fillna
replace('?', np.nan)
'''
原文地址:https://www.cnblogs.com/BookMiki/p/10484062.html