机器学习入门

机器学习入门

1. 数据集

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

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

数据集的来源:

  • Scikit-Learn:数据量小,方便学习;
  • UCI:收录360个数据集,收录了360个数据集,覆盖科学、生活、经济等领域,数据量几十万;
  • Kaggle:大数据竞赛平台,80万科学家,真实数据,数据量巨大。

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

2. 特征工程

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

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

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 归一化处理

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

  • 数值型数据:标准缩放,1)归一化 2)标准化 3)缺失值;
  • 类别型数据:one-hot编码;
  • 时间类型:时间的切分。

特点:通过对原始数据进行变换把数据映射到(默认为[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.特征选择(数据降维)

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

  • 冗余:部分特征的相关度高,容易消耗计算性能;
  • 噪声:部分特征对预测结果有负影响

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

主要方法(三大武器):

  • Filter(过滤式):VarianceThreshold,对方差进行过滤,设置方差的大小的阈值,若过小,则删除该特征;
#方差特征选择,删除低方差特征
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
  • Embedded(嵌入式):正则化、决策树;
  • Wrapper(包裹式)。

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. 机器学习基本问题

  • 监督学习(英语:Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。
  • 无监督学习(英语:Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值所组成。

两个问题:

  • 分类问题:分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变成为分类问题。最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果;
  • 回归问题:回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系,输出是连续型的值。


    机器学习开发流程(图源黑马程序员)

    (1)原始数据,明确问题做什么;
    (2)数据的基本处理:如pd处理数据(缺失值,合并表……);
    (3)特征工程(特征进行处理);
    (4)找到合适算法进行预测;
    (5)模型的评估。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容