机器学习:案例探究课程笔记

知识总览

1、Graphlab库安装以及简单介绍

2、Regression回归模型及应用

3、Classification分类模型及应用

4、Cluster聚类模型及应用

5、矩阵分解推荐系统及应用

6、深度学习-神经网络模型及应用


一、Graphlab库安装以及简单介绍

几个需要注意的地方:
  1. 应该按照graphlab官网的教程安装anaconda2
  2. 如果已经有anaconda3可以在anaconda3的envs中安装anaconda2来维持兼容性
  3. 安装完成后你可能在导入包的时候会遇到这种情况:
    机器学习:案例探究课程笔记_第1张图片
    1. 你可以尝试运行get_dependencies()并且在系统环境变量中赋予anaconda写入文件的权利,如果可以的话,最好。
    2. 不过我是等了一天都没下载好的,于是你可以进入它提示给的网址中自己下载所需要的文件,然后找到get_dependencies()的源码位置进行修改。

比如下载文件的位置在E盘,可进行如下修改。
·

    33  xzarchive_file, xzheaders) = urllib.urlretrieve('http://tukaani.org/xz/xz-5.2.1-windows.zip') #注释掉    
    34 xzarchive_file = 'E:\\xz-5.2.1-windows.zip'
    35 #xzarchive_dir = tempfile.mkdtemp()#注释掉 
    36 xzarchive_dir = 'E:\';
    43 #(dllarchive_file, dllheaders) = urllib.urlretrieve('http://repo.msys2.org/mingw/x86_64/mingw-w64-    x86_64-gcc-libs-5.1.0-1-any.pkg.tar.xz')
    44 dllarchive_file = 'E:\\mingw-w64-x86_64-gcc-libs-5.1.0-1-any.pkg.tar.xz'
    45 #dllarchive_dir = tempfile.mkdtemp()
    46 dllarchive_dir = 'E:\'

然后应该就没有问题了。


在第一周的课程中,介绍的graphlab的基本函数SFrame
通过SFrame我们可以很容易的导入数据。

import graphlab
sf=graphlab.SFrame('data.csv')

graphlab库还可以对数据进行可视化操作,比如使用show函数,见下图,其中graphlab.canvas.set_target(‘ipynb’)是把画布移到当前ipynb
机器学习:案例探究课程笔记_第2张图片

二、Regression回归模型及应用

直接引入问题:探究房价与房子面积的关系
机器学习:案例探究课程笔记_第3张图片
对于模型的选择首先考虑使用线性模型
机器学习:案例探究课程笔记_第4张图片
随后判断这条线该如何选择?通过求得平均残差方的最小值来确定相关参数。
机器学习:案例探究课程笔记_第5张图片
其次,我们考虑这个模型可能是一个二次方函数模型
机器学习:案例探究课程笔记_第6张图片
又或者是13次方
机器学习:案例探究课程笔记_第7张图片
在这里我们引入另外一个概念——过拟合。当选取拟合参数为13的时候,显而易见,这并不是一个好的模型,其过于复杂,模型的复杂程度与模型的误差有如下关系:
机器学习:案例探究课程笔记_第8张图片

代码实现

import graphlab
sales=graphlab.SFrame(home_data.gl)
graphlab.canvas.set_target('ipynb')
sales.show(view='Scatter Plot',x="sqft_living", y="price")#散点图
#随机划分训练集和测试集
train_data,test_data = sales.random_split(.8,seed=0)
#创建线性回归训练模型
sqft_model=graphlab.linear_regression.create(train_data,target='price',features=['sqft_lving'])
#评估测试集结果,得到RMSE
sqft_model.evaluate(test_data)
#获得模型参数
sqft_model.get('coefficients')

#预测新的房价
sqft_model.predict(sales[0])

注意features的参数是一个列表。
效果展示:
机器学习:案例探究课程笔记_第9张图片

三、Classification分类模型及应用

分类器有很多应用,本章介绍了线性分类器
下图介绍了对一个句子进行评定的模型,来判断该句子是积极的还是消极的。
机器学习:案例探究课程笔记_第10张图片
我们首先做了一个简单的模型,假设我们只从两个单词中进行判断,他们分别有1.0和-1.5的权重。机器学习:案例探究课程笔记_第11张图片
我们可以画出得分为0的点的集合——Decision boundary,决策边界线
机器学习:案例探究课程笔记_第12张图片

更复杂的情况,decision boundary可以不是线性的。机器学习:案例探究课程笔记_第13张图片
评估精确度的有趣现象:
百分之九十的正确率是不是很高呢?这取决于我们研究的对象,在随机猜测的情况下,能猜对的概率。
机器学习:案例探究课程笔记_第14张图片
对于大多数模型,存在一个极限Test Error。(笔者本来认为是不存在的hhh)机器学习:案例探究课程笔记_第15张图片
混淆矩阵,通过混淆矩阵(如下)我们可以得到召回率和准确率。召回率的公式是R = TP/ (TP+FN),TP代表True Positve,其他的类推。召回率(Recall Rate,也叫查全率)是检索出的相关文档数和文档库中所有的相关文档数的比率。在这里,我觉得可以理解为检索出的目标正确的预测数和所有正确预测数的比率。
机器学习:案例探究课程笔记_第16张图片

情感分析代码实现:

import graphlab
products = graphlab.SFrame('amazon_baby.gl/')
#使用文本分析器中的单词计数功能
products['word_count'] = graphlab.text_analytics.count_words(products['review'])
#ignore all 3* reviews
products = products[products['rating'] != 3]
#positive sentiment = 4* or 5* reviews
products['sentiment'] = products['rating'] >=4
train_data,test_data = products.random_split(.8, seed=0)
#使用logistic_classifier创建情感分析器
sentiment_model = graphlab.logistic_classifier.create(train_data, target='sentiment',  features=['word_count'], validation_set=test_data) 
#注意参数中validation_set在模型建立过程中已经对测试集进行了使用

#以概率的形式显示预测结果,这里的概率表示有多大把握说这个是一个大于等于4分的rating
products_reviews['predicted_sentiment']=sentiment_model.predict(products_reviews, output_type='probability')   
                               
                                                                                 

作业题:对特定的15个词进行评价。

import graphlab
#设置线程限制,节省内存,防止程序崩溃
graphlab.set_runtime_config("GRAPHLAB_DEFAULT_NUM_PYLAMBDA_WORKERS", 8)
#导入数据
products = graphlab.SFrame("amazon_baby.gl/")
#统计评论中的词语
products["word_count"] = graphlab.text_analytics.count_words(products["review"])
#选择12个词作为情感分析的输入
selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate']
#统计每一记录中各个词语的频数
def selected_words_count(dict):
    value = 0
    if i in dict:
        value = dict[i]
    return value
for i in selected_words:
    products[i] = products['word_count'] .apply(selected_words_count)   
#查看统计结果
products.head()
#---
#统计12个词出现的次数
def count(word):
    value = 0
    for i in products["word_count"]:
        if word in i:
            value += i.get(word)
    return value
list = []
for x in selected_words:
    list.append(count(x))
new_dict = dict(zip(selected_words,list))
print new_dict

#去除评论中性的词
products = products[products['rating'] != 3]
#添加新列'sentiment'
products['sentiment'] = products['rating'] >= 4

#将数据分为train(80%)和test(20%)两部分
train_data,test_data = products.random_split(.8, seed=0)
selected_words_model=graphlab.logistic_classifier.create(train_data,target='sentiment',features=selected_words,validation_set=test_data)   
#打印出每一个参量的系数,注意使用了print_rows函数                                                                                                                                                                                
selected_words_model['coefficients'].print_rows(num_rows=12)
#评估模型
graphlab.canvas.set_target('ipynb')
selected_words_model.show(view='Evaluation')

由下图我们可以看到召回率以及准确率等参数。
真阳率(True Positive Rate, TPR)就是:
含义是检测出来的真阳性样本数除以所有真实阳性样本数。
假阳率(False Positive Rate, FPR)就是:
含义是检测出来的假阳性样本数除以所有真实阴性样本数。

机器学习:案例探究课程笔记_第17张图片

四、Cluster聚类模型及应用

案例目的:找到一篇文章类似的文章。
方法:找公共词。
机器学习:案例探究课程笔记_第18张图片
由于大多数词语,如‘the’等不具有文章特色,所以我们是有TF-IDF方法来使那些文章中的特色词语凸显出来
机器学习:案例探究课程笔记_第19张图片
聚类,把相似的点聚在一起。
机器学习:案例探究课程笔记_第20张图片
举例,K-means方法,通过不断更新聚类中心来获得最优解。
机器学习:案例探究课程笔记_第21张图片

聚类代码实现:

import graphlab
people = graphlab.SFrame('people_wiki.gl/')
#维基百科词条数据
#以obama举例
obama['word_count'] = graphlab.text_analytics.count_words(obama['text'])
#通过stack方法对字典进行分类,key和item
obama_word_count_table = obama[['word_count']].stack('word_count', new_column_name = ['word','count'])
#可以通过count数据对整个表进行排序
obama_word_count_table.sort('count',ascending=False)
#对所有数据操作,并使用TF-IDf
people['word_count'] = graphlab.text_analytics.count_words(people['text'])
tfidf =graphlab.text_analytics.tf_idf(people['word_count'])
people['tfidf'] = tfidf
#举例
obama[['tfidf']].stack('tfidf',new_column_name=['word','tfidf']).sort('tfidf',ascending=False)

机器学习:案例探究课程笔记_第22张图片

#创建分类器
knn_model = graphlab.nearest_neighbors.create(people,features=['tfidf'],label='name')
#使用分类对obama进行预测
knn_model.query(obama)

机器学习:案例探究课程笔记_第23张图片

五、矩阵分解推荐系统及应用

常用的方法的预测缺乏个性化或者无法合理利用信息。
比如协同矩阵法:
利用买了这个东西的人也买了那个东西这个信息进行推荐
机器学习:案例探究课程笔记_第24张图片
限制,如果这个人没买过东西呢?如果这个人买了很多东西呢?
机器学习:案例探究课程笔记_第25张图片
我们引入了矩阵分解法,通过用户对不同类型的东西的打分,以及大众对不同东西的打分进行交叉评分,得到属于用户的个性化打分。
机器学习:案例探究课程笔记_第26张图片

代码实现:

import graphlab
song_data = graphlab.SFrame('song_data.gl/')
#使用人口模型,得分最高的被推荐
popularity_model = graphlab.popularity_recommender.create(train_data,user_id='user_id', item_id='song')   
#
personnalized_model=graphlab.item_similarity_recommender.create(train_data,user_id='user_id',item_id='song')                                                                                                 

作业题
Which of the artists below is the least popular artist, the one with smallest total listen_count, in the data set?
这里要用到groupby(key_columns, operations, *args)
其可以将关键列按给出的列聚合。
i. key_columns , which takes the column we want to group, in our case, ‘artist’
ii. operations , where we define the aggregation operation we using, in our case, we want to sum over the ‘listen_count’.

data = song_data.groupby(key_columns='artist', operations={'total_count': graphlab.aggregate.SUM('listen_count')}).sort('total_count', ascending=False)
print data[0]
print data[-1]

六、深度学习-神经网络模型及应用

如下图,是一个一层的神经网络,通过输出就可以判断出结果。
机器学习:案例探究课程笔记_第27张图片
下图是一个两层的神经网络,我们需要给每一个神经网络线赋值来达到我们想要预测的目的。
机器学习:案例探究课程笔记_第28张图片
大数据时代允许我们有非常大量的数据,我们可以通过神经网络进行更好的训练。比如进行图片识别。
下图是12年竞赛中superVision通过神经网络得到的错误率。
机器学习:案例探究课程笔记_第29张图片

代码实现:

import graphlab
#导入数据
image_train = graphlab.SFrame('image_train_data/')
image_test = graphlab.SFrame('image_test_data/')
#首先尝试使用逻辑分类器
raw_pixel_model=graphlab.logistic_classifier.create(image_train,target='label',features=['image_array'])
#进行预测
raw_pixel_model.predict(image_test[0:4])
#评估模型
raw_pixel_model.evaluate(image_test)

通过该模型得到的结果正确率只有百分之48左右,
我们需要更加深度的特征学习

#我们从云端下载模型
deep_learning_model =graphlab.load_model('http://s3.amazonaws.com/GraphLab-Datasets/deeplearning/imagenet_model_iter45')
#然后用该模型对我们已有的图片集进行特征提取,得到deep_features
image_train['deep_features'] = deep_learning_model.extract_features(image_train)

然后用该模型对我们已有的图片集进行特征提取,得到deep_features,随后我们再用logistics_classifier进行训练。

deep_features_model = graphlab.logistic_classifier.create(image_train,features=['deep_features'],target='label')
#评估模型
deep_features_model.evaluate(image_test)                                                                                                            

这次我们得到正确率为百分之八十左右。


作业题:判断某目标能否用线性分类器得到。
比如我们判断x1 AND x2 AND NOT x3。我们得到以下结果。

x1    x2    x3    | x1 AND x2 AND (NOT x3)
0     0     0     | 0
0     0     1     | 0
0     1     0     | 0
0     1     1     | 0
1     0     0     | 0
1     0     1     | 0
1     1     0     | 1
1     1     1     | 0

通过画图我们可以看出,我们可以用一个平面将目标结果与非目标结果隔离,说明我们可以使用线性分类器进行分离。
机器学习:案例探究课程笔记_第30张图片

你可能感兴趣的:(机器学习,机器学习,Coursera,笔记,华盛顿大学)