Hacker News(http://news.ycombinator.com/) 是一個國外新聞社區(qū)厦酬,用戶創(chuàng)造的內容質量遠遠超出其他創(chuàng)業(yè)者主題的網(wǎng)站。
數(shù)據(jù)下載地址:https://github.com/arnauddri/hn
數(shù)據(jù)集中存儲了從HackerNews上爬取的內容付燥,我們的目的是通過對每篇文章的headline進行分析,預測文章獲得的贊同數(shù)量寞焙,數(shù)據(jù)樣例為:
讀取文件
import pandas as pd
submissions=pd.read_csv('./data/sel_hn_stories.csv')
submissions.columns=["submission_time", "upvotes", "url", "headline"]
submissions = submissions.dropna()
submissions.head()
對headline進行分詞處理:
tokenized_headlines=[]
for headline in submissions['headline']:
tokenized_headlines.append(headline.split(" "))
# 處理tokens:大小寫轉換吕粗、去標點符號,生成unique_words
punctuation = [",", ":", ";", ".", "'", '"', "’", "?", "/", "-", "+", "&", "(", ")"]
clean_tokenized = []
for item in tokenized_headlines:
tokens=[]
for token in item:
token=token.lower()
for punc in punctuation:
token.replace(punc,"")
tokens.append(token)
clean_tokenized.append(tokens)
clean_tokenized
清理完以后的樣式:
生成單詞矩陣:
#生成單詞矩陣饱搏,并對每個headline進行詞頻統(tǒng)計
import numpy as np
unique_words=[]
sigle_words=[]
for item in clean_tokenized:
for token in item:
if token not in sigle_words:
sigle_words.append(token)
elif token not in unique_words:
unique_words.append(token)
counts=pd.DataFrame(0,index=np.arange(len(clean_tokenized)),columns=unique_words)
counts.head()
#詞頻統(tǒng)計
for i,item in enumerate(clean_tokenized):
for word in item:
if word in unique_words:
counts.iloc[i][word]+=1
counts.head()
為了提高預測的準確性非剃,我們需要過濾掉出現(xiàn)次數(shù)較少的單詞、次數(shù)較多的單詞(如a推沸、an等)备绽,這類詞對提高預測準確率沒有什么幫助。
# Cleaning dataframe:刪除出現(xiàn)頻率過多鬓催、過少columns
word_counts=counts.sum(axis=0)
counts=counts.loc[:,(word_counts>=5)&(word_counts<=100)]
counts.head()
接下來為預測過程:
產生訓練集疯坤、測試集--訓練模型--做出預測
# Split dataset to train and test set
from sklearn.cross_validation import train_test_split
x_train,x_test,y_train,y_test=train_test_split(counts,submissions['upvotes'],test_size=.2,random_state=1)
from sklearn.linear_model import LinearRegression
lr=LinearRegression()
lr.fit(x_train,y_train)
predictions=lr.predict(x_test)
mse=sum((y_test-predictions)**2)/len(predictions)
mse
得到mse為:2558.0535509833271
在我們的數(shù)據(jù)中,平均贊數(shù)為10深浮,標準差為39.5。即便對mse開方眠冈,得到的值為46.7飞苇,依然偏大。這意味著我們的平均錯誤為46.7蜗顽,遠遠大于標準差布卡,與真實值偏差太大了。
之所以偏差這么大是因為以下幾個原因:
- 為了方便操作雇盖,我使用的數(shù)據(jù)集僅僅為爬取的文件中的很小一部分忿等,可以嘗試使用更多的數(shù)據(jù)來提高預測性。
- 嘗試增加一些特征:比如標題長度崔挖、單詞平均長度
- 嘗試使用其他模式贸街,如RandomForest、Ensemble等進行預測狸相,觀察模型的性能變化薛匪。