zoukankan      html  css  js  c++  java
  • 学习SFrame,根据GraphLab库

    参考课程:机器学习基础:案例研究--华盛顿大学

    开发环境搭建,GraphLab Create安装参考:教程1教程2,以及GraphLab教育版注册链接TIps(注册邮箱中)

    黑体部分功能函数具体参考网页:GraphLab Create API DOC1.0

    • import graphlab :启动GraphLab

    • sf = graphlab.SFrame('people-example.csv') :导入数据

    • sf.tail() sf.head()

    • sf.show() :GraphLab Canvas

    • graphlab.canvas.set_target('ipynb') :canvas设为在当前的notebook中打开

    • graphlab.canvas.set_target('browser') :canvas设为在浏览器中打开

    • sf['age'].show(view='Categorical') :以分类形式显示‘age’的数据

    • sf['Country'] :显示‘Country’中的内容

    • sf['age'].mean() sf['age'].max()

    • 假设定义了transform_country函数(def),对‘Country’数据应用该函数:

      • sf['Country'].apply(transform_country)

    • train_data,test_data=sales.random_split(.8,seed=0) :按8:2的比例划分sales中数据为train和test

    • sqft_model = graphlab.regression.create( train_data,target='price',features=['sqft_living'], validation_set=None ) :利用训练集建立现行回归模型

    • 评估所建立的模型(evaluate)

      • sqft_model.evaluate(test_data)
    • 导入python的matplotlib库绘图(注意as的作用

      • import matplotlib.pyplot as plt
      • %matplotlib inline (添加此句用于直接显示plot结果,避免再加一句plt.show())
    • matplotlib.pyplot的简单应用

      • plt.plot(test_data['sqft_living'],test_data['price'],'.',test_data['sqft_living'],sqft_model.predict(test_data),'-')
      • 加一句:plt.show() #此句的添加因为之前没有添加%matplotlib inline
    • 多特征下的回归模型建立

      my_features = ['bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot', 'floors', 'zipcode']
      my_features_model = graphlab.linear_regression.create(train_data,target='price',features=my_features,validation_set=None)
      #评估两个模型
      print sqft_model.evaluate(test_data)
      print my_features_model.evaluate(test_data)
    

    • 文字分割(计数)
      • products['count word'] = graphlab.text_analytics.count_words(products['review'])
    • len(products) :数据集长度测量
    • products['rating'].show(view = 'Categorical') :分类Categorical统计products中rating数目
    • products = products[products['rating'] != 3] :排除非三星的产品
    • products['sentiments'] = products['rating']>=4 :分类增加情感sentiment类(大于3星)
    • 生成逻辑分类器
      • test_data,train_data = products.random_split(0.2,seed=0)
      • sentiment_model = graphlab.logistic_classifier.create(train_data,target = 'sentiment',features = ['word_count'],validation_set = test_data)

    AUC:(area under the curve)

    ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣,ROC即受试工作曲线,考虑ROC曲线图中的四个点和一条线。第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。Wow,这是一个完美的分类器,它将所有的样本都正确分类。第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。类似的,第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。

    ROC_curve

    利用ROC曲线评估学习好的分类器:
    • sentiment_model.evaluate(test_data,metric = 'roc_curve')
      • sentiment_model.show(view = 'Evaluation')

    • giraffe_reviews['predicted_sentiment'] = sentiment_model.predict(giraffe_reviews,output_type = 'probability') :注意后面的输出类型,原来可以定义输出的类型(这里不是直接的1or0,而是概率)

    • giraffe_reviews = giraffe_reviews.sort('predicted_sentiment', ascending = False) :对数据的某一列排序处理,递减应该有:ascending=False,递增为:ascending = True

    • 查看第一行,某一列的具体元素为:giraffe_reviews[0]['review']

    • 若查看倒数第一行,我们首先会想到len(giraffe_reviews)找到行数,接着数一下,而在python中,可以直接使用-1表示倒数第一行。giraffe_reviews[-1]['review']

    • selected_words_model['coefficients'] :用于显示所学习模型-selected_words_model的参数

    • TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆向文件频率(Inverse Document Frequency)。

    • 将string / dict / list类型SArrays的内容转换为(word,count)对的字典。

      • obama_word_count = graphlab.text_analytics.count_words(obama['text'])
    • 将dict / list / array类型的数据,重新分列:

      • obama_word_table = obama['word_count'].stack('word_count',new_column_name = ['word','count'])

    • 对全体数据做TFIDF

      • people['word_count'] = graphlab.text_analytics.count_words(people['text'])
        tfidf = graphlab.text_analytics.tf_idf( people['word_count'])
        
    • 对个体(Obama)做TFIDF,并进行根据TFIDF结果进行降序排列

      • obama = people[people['name']='Barack Obama']
        obama[['tfidf']].stack('tfidf',new_column_name=['word','tfidf']).sort('ftidf',ascending=False)
        
    • 计算两向量(obama、clinton、backham)之间的余弦距离,需要注意这里cosin距离的定义为1-***

      • clinton = people[people['name'] == 'Bill Clinton']
        beckham = people[people['name'] == 'David Beckham']
        ######################
        graphlab.distances.cosine(obama['tfidf'][0],clinton['tfidf'][0])
        graphlab.distances.cosine(obama['tfidf'][0],beckham['tfidf'][0])
        
    • knn_model = graphlab.nearest_neighbors.create(people,features=['tfidf'],label='name') :创建最近邻模型,label赋值的作用在于query时候,确定返回name的具体值。

    • knn_model.query(obama) ;询问距离数据集obama最近的人物


    • 对于一个听歌系统,有成千上万的歌曲和听歌用户,从听者众多的歌曲中找出确切的人数:

      • users = song_data['user_id'].unique()
    • popularity_model = graphlab.popularity_recomender.create(train_data, user_id = 'user_id', term_id = 'song') :基于条款流行度进行推荐

    • 为每个人都推荐当前最流行的单曲(推荐内容是一样的)

      • popularity_model.recommend(users = [users = [2]]) #users=[3]、[4]、[5].....结果一样
    • 个性化推荐:

      • personality_model = graphlab.item_similarity_recommender.create(train_data,user_id='user_id',item_id='song')
    • 推荐实例

      • personality_model.recommend(users=[users[0]]) :某一位用户个性化推荐
      • personality_model.get_similar_items(['Yellow - Coldplay']) :单曲推荐
    • 利用AUC曲线定量比较两个模型的性质(popularity_model、personality_model)

      • %matplotlib inline
      • model_performance = graphlab.recommender.util.compar_models(test_data, [popularity_model, personality_model], user_sample = 0.05)
    • 数据聚合:将数据集song中的被听得最多/最少的歌手统计出来

      • artist_count = song.groupby(key_columns='artist', operations={'total_count': graphlab.aggregate.SUM('listen_count')})
      • artist_count.sort('total_count',ascending=False)
      • artist_count.sort('total_count',ascending=True)
    • 挑选前1000名不重复的听众朋友

      • test_users = test_data['user_id'].unique( )[0:10000]
      • 对这1000位听众各推荐一首音乐,后计数统计最多的歌曲名单
        • recomendatction = personality_model.recommend(subset_test_users, k=1)
        • recomendatction.groupby(key_columns='song',operations={'count': graphlab.aggregate.COUNT()}).sort('count',ascending=False)
        • 需要说明,上一程序中使用了合计:SFrame.aggregate.COUNT(),区别与之前的.SFrame.aggregate.SUM('listen_count')
    • 通过filter_by,过滤源集中的相同的值: image_train.filter_by(querry_result['reference_label'], 'id')

    • >>> sf = graphlab.SFrame({'id': [1, 2, 3, 4],
      ...                      'animal_type': ['dog', 'cat', 'cow', 'horse'],
      ...                      'name': ['bob', 'jim', 'jimbob', 'bobjim']})
      >>> household_pets = ['cat', 'hamster', 'dog', 'fish', 'bird', 'snake']
      >>> sf.filter_by(household_pets, 'animal_type')
      +-------------+----+------+
      | animal_type | id | name |
      +-------------+----+------+
      |     dog     | 1  | bob  |
      |     cat     | 2  | jim  |
      +-------------+----+------+
      
    • Python 小技巧,lambda的使用,编写简单的函数,如:f = lambda x,y,z : x+y+z print f(1,2,3)

      • show_neighbors = lambda i : get_images_from_ids(knn_model.query(image_train[i:i+1]))
    • image_train['label'].sketch_summary() :统计总和,结果为:

    • Most frequent items:
      +-------+------------+-----+-----+------+
      | value | automobile | cat | dog | bird |
      +-------+------------+-----+-----+------+
      | count |    509     | 509 | 509 | 478  |
      +-------+------------+-----+-----+------+
      
    版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
  • 相关阅读:
    org.apache.jasper.JasperException
    泛型接口
    Mysql学习
    深入分析ClassLoader
    空格哥的第一篇Blog
    [Maven] Missing artifact
    sftp新建用户步骤
    遍历map的6种方式
    利用aop插入异常日志的2种方式
    Mybatis-Oralce批量插入方法
  • 原文地址:https://www.cnblogs.com/SrtFrmGNU/p/7328004.html
Copyright © 2011-2022 走看看