依然是按照老樣子拿到了我們的訓練集測試集還有提交模板
競賽網站:
https://www.kaggle.com/c/nlp-getting-started/overview/description
數據初步可視化
import numpy as np
import pandas as pd
from sklearn import feature_extraction, linear_model, model_selection, preprocessing
train = pd.read_csv('路徑/train.csv')
test = pd.read_csv('路徑/test.csv')
此處以keyword作爲例子,查看不同的度量對於預測結果的影響
#劃分數據集,查看相應變量中的
target1=train.keyword[train.target == 1].value_counts()
target0=train.keyword[train.target == 0].value_counts()
df=pd.DataFrame({'target1':target1,'target0':target0})
df.plot(kind='bar',stacked=True,title='keyword')
當然呢,這個圖可能略顯的凌亂,但我們可以發現有的藍色條尤其長是說明其中有的keyword是對於判斷文本是否是有顯著影響的,我們可以點開詳情查看統計
發現了次數的統計,那麼這幾個keyword就可以作爲後續的限制條件
本例只做了簡單樣例,各位老闆做參考就可
向量構築
每條 tweet中包含的單詞都是一個很好的指標,表明它們是否是真正的Disaster (可能並不完全正確)。
使用scikit learn中的countvector對每條tweet中的單詞進行計數,並將它們轉換爲機器學習模型可以處理的數據。
注:在這種情況下,向量是機器學習模型可以使用的一組數字
用前五條爲例
count_vectorizer = feature_extraction.text.CountVectorizer()
# count_vectorizer.get_feature_names() 可以查看生成的字典名
# count_vectorizer.vocabulary_ 字典形式呈現,key:詞,value:詞頻
# 讓我們計算一下數據中前5條tweets的單詞數量
example_train_vectors = count_vectorizer.fit_transform(train["text"][0:5])
## 我們在這裏使用.todense(),因爲這些向量是“離散的”(只保留非零元素以節省空間)
print(example_train_vectors[0].todense().shape)
print(example_train_vectors[0].todense())
上面告訴我們:
前五條 tweets中有54個獨特的單詞(或“標記”)。
第一條tweet([0])只包含其中一些唯一的標記——上面所有的非零計數都是第一條tweet中存在的標記。
現在爲所有的tweets創建向量:
train_vectors = count_vectorizer.fit_transform(train_df["text"])
## 注意,這裏沒有使用.fit_transform(),只是用了.transform()確保列向量中的標記是映射到測試向量的唯一標記
# 也就是說,訓練集向量和測試集向量使用同一組變化
test_vectors = count_vectorizer.transform(test_df["text"])
線性模型
正如前面提到的,每條tweet中包含的文字是一個很好的指標,可以判斷它們是否是Disaster。tweet中特定單詞(或一組單詞)的出現可能直接鏈接到該tweet是否真實。
假設這是一個線性關係,建立一個線性模型看看!
我們的向量很大,所以我們想推進模型的權重趨近於0但不完全消除,ridge regression是一個很好的方式
clf = linear_model.RidgeClassifier()
使用交叉驗證,我們對已知數據的一部分進行訓練,然後使用其他數據對其進行驗證。
這次競賽的評價標準是F1,所以我們的模型也選用這個標準
scores = model_selection.cross_val_score(clf, train_vectors, train_df["target"], cv=3, scoring="f1")
預測並提交模型
clf.fit(train_vectors, train_df["target"])
sample_submission = pd.read_csv("路徑/sample_submission.csv")
sample_submission["target"] = clf.predict(test_vectors)
sample_submission.head()
sample_submission.to_csv("路徑/submission.csv", index=False)
完成,可以提交