学习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  |
    +-------+------------+-----+-----+------+
    
posted @ 2017-08-09 22:24  SrtFrmGNU  阅读(1035)  评论(0编辑  收藏  举报