学习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曲线越接近左上角,该分类器的性能越好。
- 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 | +-------+------------+-----+-----+------+