機器學習入門——迴歸、分類、聚類、推薦系統、深度學習

本章內容源於慕課網的《機器學習入門-經典小案例》,須要安裝graphlab(它比pandas速度快,能夠直接從硬盤讀取大文件,pandas只能從內存中讀取,pandas不適合大文件)。python

graphlab只能用於python2,因爲我已經裝過Anaconda3了,因此在Anaconda3的基礎上搭建了python2.7的虛擬環境,虛擬環境下graphlab無法調用canvas進行可視化canvas

本系列全程使用python2.7(和python3.6語法略有不一樣)dom

1、迴歸模型——房價預測

import graphlab
import matplotlib.pyplot as plt
%matplotlib inline

sales = gl.SFrame('data/home_data.gl/')

#下面這兩行調用canvas進行網頁可視化
#graphlab.canvas.set_target('ipynb')                            #設置爲在ipynb界面顯示
#sales.show(view="Scatter Plot", x="sqft_living", y="price")    #繪出房價和麪積的散點圖

train_data, test_data = sales.random_split(0.8, seed=0)

#1、構建單變量回歸模型
sqft_model = graphlab.linear_regression.create(train_data, target='price', features=['sqft_living'])

#模型評估
print test_data['price'].mean()            #測試數據房價的均值    54W
print sqft_model.evaluate(test_data)    #sqft_model模型的最大偏差 414W     和RMSE均方根偏差 25.5W        差距仍是有點多

plt.plot(test_data['sqft_living'], test_data['price'], '.',
         test_data['sqft_living'], sqft_model.predict(test_data), '-')
         
sqft_model.get('coefficients')            #模型係數


#2、構建多變量回歸模型
my_features = ['bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot', 'floors', 'zipcode']
#下面兩行進行初步觀察,看一下這些特徵的數值分佈
#sales[my_features].show()
#sales.show(view='BoxWhisker Plot', x='zipcode', y='price')
my_features_model = graphlab.linear_regression.create(train_data, target='price', features=my_features)
print my_features_model.evaluate(test_data)        #my_features_model模型的最大偏差 353W     和RMSE均方根偏差 17.8W        


#模型應用
house1 = sales[sales['id'] == '5309101200']        #取出一個實例
sqft_model.predict(test_data)                    #測試集房價預測
my_features_model.predict(house1)                #對實例進行預測

2、分類模型——商品的情感分類

import graphlab

products = graphlab.SFrame('data/amazon_baby.gl/')    #讀取商品的評價數據

#對於每一個評價創建單詞計數向量
products['word_count'] = graphlab.text_analytics.count_words(products['review'])

#下面這兩行調用canvas進行網頁可視化
#products['name'].show()
#products['rating'].show(view='Categorical')    #查看評分的分佈

#定義正面和負面的標籤    4/5分爲正面,1/2分爲負面,去掉中間的3分
products = products[products['rating'] != 3]
products['sentiment'] = products['rating'] >= 4

train_data, test_data = products.random_split(0.8, seed=0)

#訓練情感分類器
sentiment_model = graphlab.logistic_classifier.create(train_data,
                                                      target='sentiment',
                                                      features=['word_count'],
                                                      validation_set=test_data)
#模型評估
sentiment_model.evaluate(test_data, metric='roc_curve')
sentiment_model.show(view='Evaluation')

#模型應用
giraffe_reviews = products[products['name'] == 'Vulli Sophie the Giraffe Teether']
giraffe_reviews['predicted_sentiment'] = sentiment_model.predict(giraffe_reviews, output_type='probability')      #輸出類型設置爲機率
giraffe_reviews = giraffe_reviews.sort('predicted_sentiment', ascending=False)                                    #評價排序

giraffe_reviews[0]['review']    #查看最棒的評價
giraffe_reviews[-1]['review']    #查看最差的評價

3、聚類模型——維基百科人物分類

 

假設詞袋裏有64篇文檔,其中63篇都包含單詞the,因此單詞the的逆向文檔頻率爲0。同理,單詞Messi(梅西)的頻率爲4python2.7

 

import graphlab

people = graphlab.SFrame('data/people_wiki.gl/')

#分析奧巴馬
obama = people[people['name'] == 'Barack Obama']
obama['word_count'] = graphlab.text_analytics.count_words(obama['text'])                                #取得奧巴馬文章中的單詞計數
obama_word_count_table = obama[['word_count']].stack('word_count', new_column_name=['word', 'count'])    #將word_count分紅word和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            #people中構建新的特徵tfidf

#檢查奧巴馬文章中的TF-IDF
obama = people[people['name'] == 'Barack Obama']                                                    #從新讀入奧巴馬數據,此時讀入後帶有tfidf字段(若不從新讀入,下面句代碼會報錯)
obama[['tfidf']].stack('tfidf', new_column_name=['word', 'tfidf']).sort('tfidf', ascending=False)    #按照TF-IDF降序排列(並不是單純的詞頻排序哈)

#計算幾我的之間的距離
clinton = people[people['name'] == 'Bill Clinton']
beckham = people[people['name'] == 'David Beckham']
print graphlab.distances.cosine(obama['tfidf'][0], clinton['tfidf'][0])    #奧巴馬和克林頓的餘弦距離爲0.83
print graphlab.distances.cosine(obama['tfidf'][0], beckham['tfidf'][0])    #奧巴馬和貝克漢姆的餘弦距離爲0.97        因此奧巴馬和克林頓更「類似」

#構建文檔檢索的最近鄰域模型
knn_model = graphlab.nearest_neighbors.create(people, features=['tfidf'], label='name')
print knn_model.query(obama)        #誰和奧巴馬最接近
print knn_model.query(beckham)    #誰和貝克漢姆最接近

 

4、推薦系統——音樂推薦

import graphlab

song_data = graphlab.SFrame('data/song_data.gl/')

#song_data['song'].show()                #展現數據集中最流行的音樂
print len(song_data)                     #111W條

users = song_data['user_id'].unique()    #用戶去重
print len(users)                         #6.6W條,和歌曲數目不一樣(由於一我的可能聽不少首歌)

train_data, test_data = song_data.random_split(0.8, seed=0)

#基於流行度的推薦系統
popularity_model = graphlab.popularity_recommender.create(train_data, user_id='user_id', item_id='song')
#對用戶0和用戶1的推薦,和最流行的音樂榜幾乎一致
popularity_model.recommend(users=[users[0]])
popularity_model.recommend(users=[users[1]])


#基於個性化的推薦系統
personalized_model = graphlab.item_similarity_recommender.create(train_data, user_id='user_id', item_id='song')
#對於用戶0和用戶1的推薦大不相同
personalized_model.recommend(users=[users[0]])
personalized_model.recommend(users=[users[1]])

#推薦系統的比較
model_performance = graphlab.compare(test_data, [popularity_model, personalized_model], user_sample=0.05)
graphlab.show_comparison(model_performance, [popularity_model, personalized_model])

 

5、深度學習——圖像檢索系統

import graphlab

image_train = graphlab.SFrame('data/image_train_data/')

#下面兩行運行好久,且報錯
#deep_learning_model = graphlab.load_model('http://s3.amazonaws.com/GraphLab-Datasets/deeplearning/imagenet_model_iter45')        #導入深度學習模型
#deep_learning_model.extract_features(image_train)   #經過模型抽取image_train深度特徵

#基於深度特徵構建K近鄰模型,從而進行圖像檢索
knn_model = graphlab.nearest_neighbors.create(image_train, features=['deep_features'], label='id')    

#尋找貓的類似圖像
cat = image_train[18:19]    #取出某隻貓的圖像,不妨給這隻貓命名爲tony
#cat['image'].show()            
knn_model.query(cat)        #進行檢索

#經過reference_label關聯id獲得images(即取出reference_label=id的圖像)
def get_images_from_ids(query_result):
    return image_train.filter_by(query_result['reference_label'], 'id')    

cat_neighbors = get_images_from_ids(knn_model.query(cat))    #經過上述函數獲得這隻tony貓的「鄰居」
cat_neighbors['image'].show()


#尋找轎車的類似圖像
car = image_train[8:9]
#car['image'].show()
get_images_from_ids(knn_model.query(car))['image'].show()


#構造一個lambda函數來尋找和顯示最近的圖像
show_neighbors = lambda i: get_images_from_ids(knn_model.query(image_train[i:i+1]))['image'].show()
show_neighbors(8)    #顯示tony貓的「鄰居」
show_neighbors(18)    #顯示小轎車的「鄰居」

相關文章
相關標籤/搜索