Hacker News(http://news.ycombinator.com/) 是一個國外新聞社區,用戶創造的內容質量遠遠超出其他創業者主題的網站。
數據下載地址:https://github.com/arnauddri/hn
數據集中存儲了從HackerNews上爬取的內容,我們的目的是通過對每篇文章的headline進行分析,預測文章獲得的贊同數量,數據樣例為:
讀取文件
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進行詞頻統計
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()
#詞頻統計
for i,item in enumerate(clean_tokenized):
for word in item:
if word in unique_words:
counts.iloc[i][word]+=1
counts.head()
為了提高預測的準確性,我們需要過濾掉出現次數較少的單詞、次數較多的單詞(如a、an等),這類詞對提高預測準確率沒有什么幫助。
# Cleaning dataframe:刪除出現頻率過多、過少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
在我們的數據中,平均贊數為10,標準差為39.5。即便對mse開方,得到的值為46.7,依然偏大。這意味著我們的平均錯誤為46.7,遠遠大于標準差,與真實值偏差太大了。
之所以偏差這么大是因為以下幾個原因:
- 為了方便操作,我使用的數據集僅僅為爬取的文件中的很小一部分,可以嘗試使用更多的數據來提高預測性。
- 嘗試增加一些特征:比如標題長度、單詞平均長度
- 嘗試使用其他模式,如RandomForest、Ensemble等進行預測,觀察模型的性能變化。