Disaster Tweets
題意:
就是給出一個dataframe包含text這一列代表著文本,文本會有一些詞,問對于每條記錄中的text是真關于災難的還是假關于災難的。
比如我們說今天作業真多,這真是一場災難。實際上這個災難只是我們調侃而言的。
數據處理:
1.首先要將文本轉化為模型可以接受的數據。建立vectorizer將文本轉換為詞頻矩陣,先fit訓練數據,然后把這個vectorizer再應用到test數據上,這樣才能保證測試數據和訓練數據的一致性。
2.拆分訓練集合和驗證集合,對下面模型融合進行評估。
建立模型:
1.邏輯歸回模型LogisticRegression,設置本模型的網格搜索參數,對lr進行超參數優化。
2.隨機森林模型RandomForestClassifier,設置本模型的網格搜索參數,對rf進行超參數優化。
3.xgboost模型XGBClassifier,設置本模型的網格搜索參數,對xgb進行超參數優化。
4.投票模型融合,把三個算法的最佳參數下的模型進行融合訓練,求出預測分數。只是把某個答案出現次數最多的作為答案。
5.加權模型融合,只是在投票模型的基礎上,為每個模型分配一個權重。
6.堆疊模型融合,把三個模型輸出答案作為次級模型的輸入,再進行訓練,預測出結果。邏輯回歸模型會學習如何結合基模型的預測概率,以更準確地預測樣本的類別。
例如,模型可能會學習到:
當基模型1和基模型3的預測概率較高時,樣本更可能屬于類別1。
當基模型2的預測概率較高時,樣本更可能屬于類別0。
代碼:
import sys
import pandas as pd
from sklearn.ensemble import RandomForestClassifier, VotingClassifier, StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn import feature_extraction, model_selection
from sklearn.model_selection import GridSearchCV
from xgboost import XGBClassifierif __name__ == '__main__':#數據處理data_train = pd.read_csv('/kaggle/input/nlp-getting-started/train.csv')data_test = pd.read_csv('/kaggle/input/nlp-getting-started/test.csv')vectorizer = feature_extraction.text.CountVectorizer()X_train = vectorizer.fit_transform(data_train['text'])Y_train = data_train['target']X_test = vectorizer.transform(data_test['text'])X_train,X_val,Y_train,Y_val = model_selection.train_test_split(X_train,Y_train,test_size=0.2,random_state=42)#lr模型lr_param_grid = {'penalty': ['l1', 'l2', 'elasticnet', None], #指定正則化類型,用于防止模型過擬合。# 'C': [0.001, 0.01, 0.1, 1, 10, 100], #正則化強度的倒數,值越小表示正則化越強。# 'solver': ['liblinear', 'saga'], #指定用于求解邏輯回歸參數的優化算法。# 'class_weight': [None, 'balanced'] #指定類別權重,用于處理類別不平衡問題。}lr_model = GridSearchCV(estimator = LogisticRegression(random_state=42), #對什么模型進行搜索超參數param_grid = lr_param_grid, #超參數的候選值scoring = 'accuracy', #使用準確率作為評估指標cv = 3, #使用3折交叉驗證n_jobs = -1, #使用所有cpu并行運算)lr_model.fit(X_train, Y_train)print('lr預測分數:' + str(lr_model.score(X_val, Y_val)))#rf模型rf_param_grid = {'n_estimators': [50, 100, 200], #樹的數量# 'max_depth': [None, 10, 20, 30], #樹的最大深度# 'min_samples_split': [2, 5, 10], #節點分裂所需的最小樣本數# 'min_samples_leaf': [1, 2, 4], #葉節點所需的最小樣本數# 'max_features': ['auto', 'sqrt', 'log2'], #找最佳分裂時考慮的最大特征數# 'bootstrap': [True, False] #否使用有放回抽樣構建樹}rf_model = GridSearchCV(estimator=RandomForestClassifier(random_state=42), # 對什么模型進行搜索超參數param_grid=rf_param_grid, # 超參數的候選值scoring='accuracy', # 使用準確率作為評估指標cv=3, # 使用3折交叉驗證n_jobs=-1, # 使用所有cpu并行運算)rf_model.fit(X_train, Y_train)print('rf預測分數:' + str(rf_model.score(X_val, Y_val)))#xgb模型xgb_param_grid = {'n_estimators': [50, 100, 200], #樹的數量# 'max_depth': [3, 4, 5, 6], #樹的最大深度# 'learning_rate': [0.01, 0.1, 0.2], #學習速率# 'subsample': [0.8, 1.0], #指定每次迭代中用于訓練每棵樹的數據比例# 'colsample_bytree': [0.8, 1.0], #指定每次迭代中用于訓練每棵樹的特征比例# 'gamma': [0, 0.1, 0.2], #最小損失減少值# 'min_child_weight': [1, 3, 5], #子節點所需的最小樣本權重和# 'reg_alpha': [0, 0.1, 1], #控制模型的正則化強度# 'reg_lambda': [0, 0.1, 1] #控制模型的正則化強度}xgb_model = GridSearchCV(estimator = XGBClassifier(random_state=42), #對什么模型進行搜索超參數param_grid = xgb_param_grid, #超參數的候選值scoring = 'accuracy', #使用準確率作為評估指標cv = 3, #使用3折交叉驗證n_jobs = -1, #使用所有cpu并行運算)xgb_model.fit(X_train,Y_train)print('xgb預測分數:' + str(xgb_model.score(X_val, Y_val)))lr_best = lr_model.best_estimator_rf_best = rf_model.best_estimator_xgb_best = xgb_model.best_estimator_#投票模型融合voting_model = VotingClassifier(estimators=[('lr', lr_best), ('rf', rf_best), ('xgb', xgb_best)],voting='soft' # 使用預測概率的平均值)voting_model.fit(X_train, Y_train)print('投票模型融合預測分數:' + str(voting_model.score(X_val, Y_val)))#加權投票模型融合lr_score = lr_model.score(X_val,Y_val)rf_score = rf_model.score(X_val,Y_val)xgb_score = xgb_model.score(X_val,Y_val)total_score = lr_score + rf_score + xgb_scoreweights = [lr_score / total_score, rf_score / total_score, xgb_score / total_score]weighted_voting_model = VotingClassifier(estimators=[('lr', lr_best), ('rf', rf_best), ('xgb', xgb_best)],voting='soft',weights=weights)weighted_voting_model.fit(X_train, Y_train)print('加權模型融合預測分數:' + str(weighted_voting_model.score(X_val, Y_val)))#堆疊模型融合stacking_model = StackingClassifier(estimators = [('lr', lr_best), ('rf', rf_best), ('xgb', xgb_best)],final_estimator=LogisticRegression(),cv=3 # 使用3折交叉驗證生成元模型的訓練數據)stacking_model.fit(X_train, Y_train)print('堆疊模型融合預測分數:' + str(stacking_model.score(X_val, Y_val)))Submission = pd.DataFrame({'id': data_test['id'],'target': stacking_model.predict(X_test)})Submission.to_csv('/kaggle/working/Submission.csv', index=False)