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

本章內容源於慕課網的《機器學習入門-經典小案例》,須要安裝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)    #顯示小轎車的「鄰居」

相關文章
相關標籤/搜索