人工智能工厂

机器学习入门

2019-03-09  本文已影响21人  Aptitude

机器学习入门

1. 数据集

一般来说,机器学习中用的数据集时来自文件,比较少来自数据库。在数据库中如MySQL容易遇到性能瓶颈,读取速度比较慢。另外MySQL格式不太符合机器学习要求数据的格式。

强大的工具——Pandas,读取和数据工具,是基于numpy的。Python是动态语言比较慢,numpy速度比较快。原因是全局解释性锁(GIL)。全局解释器锁,作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行。numpy开启的是真正的多线程,即多个线程并行的执行,numpy把GIL释放了。

数据集的来源:

机器学习中大多数数据是由特征和目标组成的。

2. 特征工程

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

2.1 Scikit-Learn

2.1.1 字典特征抽取
from sklearn.feature_extraction import DictVectorizer

def dictvec():
    #将DictVectorizer()实例化,对字典数据进行特征值化
    dict = DictVectorizer(sparse=False)
    #调用fit_tranform
    data = dict.fit_transform([{'city':'北京','temperature':100},
                        {'city':'上海','temperature':60},
                        {'city':'深圳','temperature':30}])
    print(data)  #输出为sparse矩阵
    return None

if __name__ == "__main__":
    dictvec()

DictVectorizer()中sparse中的值默认为true.


sparse=False
sparse=Ture

DictVectorizer()中sparse中的值默认为true.数组形式,有类别特征。采用的是one-hot编码

sparse矩阵有利于节约内存,方便读取处理,只将非0值的位置和值展示出来。

DictVectorizer.fit_transform(X)       
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换

2.2 文本特征抽取

#对文本进行特征值化
def countvec():
    cv = CountVectorizer()
    data = cv.fit_transform(["life life is short,i like python","life is too long,i dislike python"])
    print(cv.get_feature_names())
   # print(data)
    #固定的方法,把sparse矩阵转化为数组形式
    print(data.toarray())
    return None
'''输出:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 2 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
'''
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. 准备句子,利用jieba.cut进行分词
  2. 实例化CountVectorizer
  3. 将分词结果变成字符串当作fit_transform的输入值
def cutword():
    con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
    con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
    con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
    print('con1 = ')
    print(type(con1))
    #转换成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)
    print('content1 = ')
    print(content1)
    print(type(content1))
    #把列表转换成字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)
    print('c1 = ')
    print(type(c1))
    return c1,c2,c3

#中文特征值化
def hanzivec():
    c1,c2,c3 = cutword()
    cv = CountVectorizer()
    data = cv.fit_transform([c1,c2,c3])
    print(cv.get_feature_names())
    print(data.toarray())
    return None

2.3 TfIdf

Tf: term frequency,词的频率;

idf: inverse document frequency,逆文档频率,log(总文档数量/该词出现的文档数)

重要性=Tf×Idf,衡量每篇文档中重要的词汇。

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

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

def tfidfvec():
    c1,c2,c3 = cutword()
    tf = TfidfVectorizer()
    data = tf.fit_transform([c1,c2,c3])
    print(tf.get_feature_names())
    print(data.toarray())
    return None
TfIdf结果

2.4 归一化处理

特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据。

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

X^'={x-min}\frac{max-min}
X^{''}=X^{'}*(mx-mi)+mi
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’
为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0。

#归一化处理
def mm():
    mm = MinMaxScaler(feature_range=(2,3))
    data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
    print(data)
    return None

当三个特征同等重要的时候,进行归一化处理,使得某一个特征不会对最终的结果造成更大的影响。

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

标准化方式:X^'={x-mean}\frac {\sigma},\sigma为标准差。

对于归一化来说,如果出现异常点,影响了最大值和最小值,那么结果显然发生改变。

对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。因此,大多数使用标准化。

#标准化处理
def stand():
    std = StandardScaler();
    data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
    print(data)
    print(std.mean_)
    print(std.scale_)

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

2.5 缺失值处理

Imputer(missing_values='NaN', strategy='mean', axis=0)
#完成缺失值插补
Imputer.fit_transform(X,y)       
#X:numpy array格式的数据[n_samples,n_features]
#返回值:转换后的形状相同的array
#缺失值处理
def im():
    #axis中,0是按列填补,1是按行填补
    im = Imputer(missing_values='NaN',strategy='mean',axis=0)
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)
    return None

3.特征选择(数据降维)

降维:减少特征的维度,非数组的维度,即减少特征的数量。

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

主要方法(三大武器):

#方差特征选择,删除低方差特征
def var():
    va = VarianceThreshold(threshold=1.0)
    data = va.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)
    return None

4. 主成分分析

PCA:特征数量达到上百的时候,考虑数据的简化。PCA是一种分析、简化数据集的技术
。是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。可以削减回归分析或者聚类分析中特征的数量。

#主成分分析进行特征降维
def pca():
# n_components:
#1)小数:0-100%,一般90%-95%,表示保留的信息量
#2)整数:保留的特征数
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
    print(data)
#输出
[[ 1.28620952e-15  3.82970843e+00]
 [ 5.74456265e+00 -1.91485422e+00]
 [-5.74456265e+00 -1.91485422e+00]]

案例分析:

import pandas as pd
from sklearn.decomposition import  PCA
#读取表的数据
prior = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\order_products__prior2.csv')
products = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\products2.csv')
orders = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\orders2.csv')
aisles = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\\aisles.csv')
#合并四张表到一张表
_mg = pd.merge(prior,products,on=['product_id','product_id'])
_mg = pd.merge(_mg,orders,on=['order_id','order_id'])
_mg = pd.merge(_mg,aisles,on=['aisle_id','aisle_id'])
print(_mg.head(10))
#交叉表(特殊的分组工具),交叉表是用于统计分组频率的特殊透视表
cross = pd.crosstab(_mg['user_id'],_mg['aisle'])
#进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)

交叉表的使用

3. 机器学习基本问题

两个问题:

上一篇 下一篇

猜你喜欢

热点阅读