@浙大疏錦行復習日
仔細回顧一下之前21天的內容,沒跟上進度的同學補一下進度。
作業:
自行學習參考如何使用kaggle平臺,寫下使用注意點,并對下述比賽提交代碼
導入需要的庫
import pandas as pd # 用于數據處理和分析,可處理表格數據。
import numpy as np # 用于數值計算,提供了高效的數組操作。
import matplotlib.pyplot as plt # 用于繪制各種類型的圖表
import seaborn as sns # 基于matplotlib的高級繪圖庫,能繪制更美觀的統計圖形。
import warnings
from sklearn.preprocessing import StandardScaler,MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier #隨機森林分類器
from sklearn.metrics import make_scorer,accuracy_score, precision_score, recall_score, f1_score # 用于評估分類器性能的指標
from sklearn.metrics import classification_report, confusion_matrix #用于生成分類報告和混淆矩陣
plt.rcParams['figure.dpi'] = 300
warnings.filterwarnings("ignore") # 設置中文字體(解決中文顯示問題)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系統常用黑體字體
plt.rcParams['axes.unicode_minus'] = False # 正常顯示負號
train = pd.read_csv('train.csv') # 讀取數據
print(train.isnull().sum()) Survived 是否存活(label)
PassengerId (乘客ID)
Pclass(用戶階級):1 - 1st class,高等用戶;2 - 2nd class,中等用戶;3 - 3rd class,低等用戶;
Name(名字)
Sex(性別)
Age(年齡)
SibSp:描述了泰坦尼克號上與乘客同行的兄弟姐妹(Siblings)和配偶(Spouse)數目;
Parch:描述了泰坦尼克號上與乘客同行的家長(Parents)和孩子(Children)數目;
Ticket(船票號)
Fare(乘客費用)
Cabin(船艙)
Embarked(港口):用戶上船時的港口
PassengerId(乘客ID),Name(姓名),Ticket(船票信息)存在唯一性,三類意義不大,可以考慮不加入后續的分析
看一下訓練集有沒有缺失值

可以看到Age,Cabin,Embarked有缺失值
#對Age使用中位數填充
median_income = train['Age'].median()
train['Age'].fillna(median_income, inplace=True)mode = train['Embarked'].mode()
print(mode)
mode = mode[0]
# 眾數填補
train['Embarked'].fillna(mode, inplace=True)
# 檢查下是否有缺失值
print(train['Embarked'].isnull().sum())# 對 Cabin 列的缺失值填充為 'U'
train['Cabin'] = train['Cabin'].fillna('U')
print(train.isnull().sum()) 
現在已無缺失值
對數據做一下分析
對數據的認識是十分重要的,所以我們在這里進行對各個字段的分析,看看每個屬性與最后的Survived有什么關系
?
# 統計存活(Survived=1)和死亡(Survived=0)的人數
survived_counts = train['Survived'].value_counts()# 設置Seaborn風格
sns.set_style('ticks')# 配置中文字體,解決中文顯示異常問題
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 創建畫布,設置餅圖為正圓形(figsize設為正方形)
fig, ax = plt.subplots(figsize=(6, 6))# 繪制餅圖
survived_counts.plot.pie(ax=ax,autopct='%1.2f%%', # 顯示百分比,保留2位小數labels=['死亡', '存活'], # 自定義圖例標簽colors=['#FF6B6B', '#4ECDC4'], # 自定義顏色,紅色代表死亡,青色代表存活startangle=90, # 餅圖從正上方開始繪制textprops={'fontsize': 12} # 設置百分比文字大小
)# 設置標題
ax.set_title('泰坦尼克號乘客存活比例', fontsize=14, fontweight='bold', pad=20)
ax.set_ylabel('') # 移除默認的y軸標簽# 移除頂部和右側的邊框,讓圖表更簡潔
sns.despine(top=True, right=True)# 自動調整布局,防止元素重疊
plt.tight_layout()
plt.show() 
在這次中,大約有38.38%的人存活了下來
分別看一下各屬性的基本分布情況,首先我們對適合利用圖形展示的屬性,通過繪圖的方式探查屬性的分布,分類型和數值型數據非常適合繪圖,所以這部分我們選擇乘客等級、性別、年齡、票價和登船港口五類屬性。
# 繪圖
fig = plt.figure()
# 乘客等級分布
plt.subplot2grid((2, 3), (0, 0))
train['Pclass'].value_counts().plot(kind='bar')
plt.ylabel(u"人數")
plt.xlabel(u'乘客等級')
plt.title(u'乘客等級分布')# 乘客性別分布
plt.subplot2grid((2, 3), (0, 1))
train['Sex'].value_counts().plot(kind='bar')
plt.ylabel(u"人數")
plt.xlabel(u'性別')
plt.title(u'乘客性別分布')# 乘客的年齡分布
plt.subplot2grid((2, 3), (0, 2))
train['Age'].hist()
plt.xlabel(u'年齡')
plt.title(u'乘客年齡分布')# 票價的分布
plt.subplot2grid((2, 3), (1, 0))
train['Fare'].hist()
plt.xlabel(u'票價')
plt.title(u'船票票價分布')# 箱線圖:票價的異常情況探查
plt.subplot2grid((2, 3), (1, 1))
train['Fare'].plot(kind='box')
plt.title(u'票價箱線圖')# 登船港口的分布情況
plt.subplot2grid((2, 3), (1, 2))
train['Embarked'].value_counts().plot(kind='bar')
plt.xlabel(u'登船口')
plt.title(u'登船口乘客量分布')
plt.show() 
對于乘客等級、性別、登船口這類類別型的屬性,從柱狀圖上探查各類的分布情況,而對于年齡和票價這類連續型的屬性,我們可以選擇利用直方圖查看屬性的分布。從乘客等級分布的柱狀圖上,我們得到三等乘客人數最多,1等和2等的乘客相對較少(等級順序:1>2>3);在性別上,男性多于女性;在登船港口上,發現人數從高到低的港口分別是S>C>Q;看一下年齡的分布情況,我們發現20~30歲區間的乘客人數最多。
分析Sex
# 男性和女性存活情況
train[['Sex','Survived']].groupby('Sex').mean().plot.bar()survive_sex=train.groupby(['Sex','Survived'])['Survived'].count()print('女性存活率%.2f%%,男性存活率%.2f%%' %(survive_sex.loc['female',1]/survive_sex.loc['female'].sum()*100,survive_sex.loc['male',1]/survive_sex.loc['male'].sum()*100))
plt.tight_layout()
plt.show() 
女性存活率74.20%,男性存活率18.89%
從數據結果可以得出,女性存活率是更高的
分析Age
g = sns.FacetGrid(train, col='Survived')
g.map(plt.hist, 'Age', bins=20)
plt.tight_layout()
plt.show() 
從上圖可以看出,Age與survived是有關系的,因此需要作為特征保存
分析登陸港口

# 繪圖
plt.figure(figsize=(10, 8), dpi=100)# 乘客的等級和獲救情況的關系, 從結果上發現,1和2等級的乘客獲救率明顯高于3等級的乘客
p1 = plt.subplot(221)
Pclass_0 = train.loc[train['Survived'] == 0, 'Pclass'].value_counts()
Pclass_1 = train.loc[train['Survived'] == 1, 'Pclass'].value_counts()
df_pclass = pd.DataFrame({u'獲救':Pclass_1,u'未獲救':Pclass_0})
df_pclass.plot(kind='bar', ax=p1)
plt.title(u'不同等級乘客的獲救情況')# 同樣的方法,我們看一下性別和獲救情況的關系,結果非常明顯,女性比男性的獲救率高
p2 = plt.subplot(222)
Survived_m = train.loc[train['Sex'] == 'male', 'Survived'].value_counts()
Survived_f = train.loc[train['Sex'] == 'female', 'Survived'].value_counts()
df_sex = pd.DataFrame({u'男性':Survived_m, u'女性':Survived_f})
df_sex.plot(kind='bar', stacked=True, ax=p2)
plt.title(u'不同性別乘客的獲救情況')# 年齡劃分,劃分的標準:0~10為兒童;10~60為成年人;60及以上為老年人
p3 = plt.subplot(223)
bins = [min(train['Age']), 10, 60, max(train['Age'])]
bins_label = ['10歲及以下', '10-60歲', '60歲以上']
train['Age_cut'] = pd.cut(train['Age'], bins=bins, labels=bins_label)
print(train['Age_cut'].value_counts())
# 再對數據進行統計,結果發現兒童的獲救率明顯高于成年人和老年人
Age_0 = train.loc[train['Survived'] == 0, 'Age_cut'].value_counts()
Age_1 = train.loc[train['Survived'] == 1, 'Age_cut'].value_counts()
df_age = pd.DataFrame({u'獲救':Age_1, u'未獲救':Age_0})
df_age.plot(kind='bar', ax=p3)
plt.title(u'不同年齡階段乘客的獲救情況')
plt.show() 
從圖中得的以下結論:等級高的乘客獲救率高(1>2>3);女性獲救率遠大于男性
其次,針對類別較多的SibSp和Parch屬性,我們直接統計各類的是否獲救情況。
# 堂兄弟妹個數以及父母子女個數的獲救情況統計
g1 = train.groupby(['SibSp', 'Survived'])
df_SibSp = pd.DataFrame(g1.count()['PassengerId'])
df_SibSp.rename(columns={'PassengerId':'count'}, inplace=True)
print(df_SibSp)g2 = train.groupby(['Parch', 'Survived'])
df_Parch = pd.DataFrame(g2.count()['PassengerId'])
df_Parch.rename(columns={'PassengerId': 'count'}, inplace=True)
print(df_Parch) 
從結果中,我們發現,SibSp<3和Parch<3的情況下,獲救率更高。
分析Fare
print(train.loc[train['Fare'] == 0, 'Survived'].value_counts())
print(train.loc[train['Fare'] == max(train['Fare']), 'Survived'].value_counts())
plt.show() 結果發現,票價為0的15名乘客,僅有1人獲救,而票價最高的三名乘客,全部獲救,這說明了票價的高低對是否獲救存在影響
#刪除無用特征Name、Ticket 、Cabin
train= train.drop(columns=["Name","Ticket","Cabin"])#接下來對sex、embarked進行獨熱編碼
# 對Sex、Embarked進行獨熱編碼
train["Sex"] = pd.get_dummies(train["Sex"], dtype=int, drop_first=True)
train_data = pd.concat([train.drop("Embarked", axis=1),pd.get_dummies(train["Embarked"], prefix="Embarked", dtype=int, drop_first=False)], axis=1)# 查看數據
print(train_data.head(10))#對測試集進行處理
# 刪除無用特征Name、Ticket 、Cabin,補全缺失值
test = pd.read_csv('test.csv') # 讀取數據
test = test.drop(columns=["Name", "Ticket", "Cabin"])# 連續
continuous_features = test.select_dtypes(include=['float64', 'int64']).columns.tolist()
# 離散
discrete_features = test.select_dtypes(exclude=['float64', 'int64']).columns.tolist()# 離散特征使用眾數進行補全
for feature in discrete_features:if test[feature].isnull().sum() > 0:mode_value = test[feature].mode()[0]test[feature].fillna(mode_value, inplace=True)# 連續變量用中位數進行補全
for feature in continuous_features:if test[feature].isnull().sum() > 0:median_value = test[feature].median()test[feature].fillna(median_value, inplace=True)
print(test.info())print(test.head(10))# 對Sex、Embarked進行獨熱編碼
test["Sex"] = pd.get_dummies(test["Sex"], dtype=int, drop_first=True)
test_data = pd.concat([test.drop("Embarked", axis=1),pd.get_dummies(test["Embarked"], prefix="Embarked", dtype=int, drop_first=False)], axis=1)# 查看數據
print(test_data.head(10))from sklearn.model_selection import train_test_split
X = train_data.drop(['Survived'], axis=1) # 特征,axis=1表示按列刪除
y = train_data['Survived'] # 標簽
# 按照8:2劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 80%訓練集,20%測試集# SVM
svm_model = SVC(random_state=42)
svm_model.fit(X_train, y_train)
svm_pred = svm_model.predict(X_test)print("\nSVM 分類報告:")
print(classification_report(y_test, svm_pred)) # 打印分類報告
print("SVM 混淆矩陣:")
print(confusion_matrix(y_test, svm_pred)) # 打印混淆矩陣# 計算 SVM 評估指標,這些指標默認計算正類的性能
svm_accuracy = accuracy_score(y_test, svm_pred)
svm_precision = precision_score(y_test, svm_pred)
svm_recall = recall_score(y_test, svm_pred)
svm_f1 = f1_score(y_test, svm_pred)
print("SVM 模型評估指標:")
print(f"準確率: {svm_accuracy:.4f}")
print(f"精確率: {svm_precision:.4f}")
print(f"召回率: {svm_recall:.4f}")
print(f"F1 值: {svm_f1:.4f}")# KNN
knn_model = KNeighborsClassifier()
knn_model.fit(X_train, y_train)
knn_pred = knn_model.predict(X_test)print("\nKNN 分類報告:")
print(classification_report(y_test, knn_pred))
print("KNN 混淆矩陣:")
print(confusion_matrix(y_test, knn_pred))knn_accuracy = accuracy_score(y_test, knn_pred)
knn_precision = precision_score(y_test, knn_pred)
knn_recall = recall_score(y_test, knn_pred)
knn_f1 = f1_score(y_test, knn_pred)
print("KNN 模型評估指標:")
print(f"準確率: {knn_accuracy:.4f}")
print(f"精確率: {knn_precision:.4f}")
print(f"召回率: {knn_recall:.4f}")
print(f"F1 值: {knn_f1:.4f}")# 邏輯回歸
logreg_model = LogisticRegression(random_state=42)
logreg_model.fit(X_train, y_train)
logreg_pred = logreg_model.predict(X_test)print("\n邏輯回歸 分類報告:")
print(classification_report(y_test, logreg_pred))
print("邏輯回歸 混淆矩陣:")
print(confusion_matrix(y_test, logreg_pred))logreg_accuracy = accuracy_score(y_test, logreg_pred)
logreg_precision = precision_score(y_test, logreg_pred)
logreg_recall = recall_score(y_test, logreg_pred)
logreg_f1 = f1_score(y_test, logreg_pred)
print("邏輯回歸 模型評估指標:")
print(f"準確率: {logreg_accuracy:.4f}")
print(f"精確率: {logreg_precision:.4f}")
print(f"召回率: {logreg_recall:.4f}")
print(f"F1 值: {logreg_f1:.4f}")# 樸素貝葉斯
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)
nb_pred = nb_model.predict(X_test)print("\n樸素貝葉斯 分類報告:")
print(classification_report(y_test, nb_pred))
print("樸素貝葉斯 混淆矩陣:")
print(confusion_matrix(y_test, nb_pred))nb_accuracy = accuracy_score(y_test, nb_pred)
nb_precision = precision_score(y_test, nb_pred)
nb_recall = recall_score(y_test, nb_pred)
nb_f1 = f1_score(y_test, nb_pred)
print("樸素貝葉斯 模型評估指標:")
print(f"準確率: {nb_accuracy:.4f}")
print(f"精確率: {nb_precision:.4f}")
print(f"召回率: {nb_recall:.4f}")
print(f"F1 值: {nb_f1:.4f}")# 決策樹
dt_model = DecisionTreeClassifier(random_state=42)
dt_model.fit(X_train, y_train)
dt_pred = dt_model.predict(X_test)print("\n決策樹 分類報告:")
print(classification_report(y_test, dt_pred))
print("決策樹 混淆矩陣:")
print(confusion_matrix(y_test, dt_pred))dt_accuracy = accuracy_score(y_test, dt_pred)
dt_precision = precision_score(y_test, dt_pred)
dt_recall = recall_score(y_test, dt_pred)
dt_f1 = f1_score(y_test, dt_pred)
print("決策樹 模型評估指標:")
print(f"準確率: {dt_accuracy:.4f}")
print(f"精確率: {dt_precision:.4f}")
print(f"召回率: {dt_recall:.4f}")
print(f"F1 值: {dt_f1:.4f}")# 隨機森林
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train)
rf_pred = rf_model.predict(X_test)print("\n隨機森林 分類報告:")
print(classification_report(y_test, rf_pred))
print("隨機森林 混淆矩陣:")
print(confusion_matrix(y_test, rf_pred))rf_accuracy = accuracy_score(y_test, rf_pred)
rf_precision = precision_score(y_test, rf_pred)
rf_recall = recall_score(y_test, rf_pred)
rf_f1 = f1_score(y_test, rf_pred)
print("隨機森林 模型評估指標:")
print(f"準確率: {rf_accuracy:.4f}")
print(f"精確率: {rf_precision:.4f}")
print(f"召回率: {rf_recall:.4f}")
print(f"F1 值: {rf_f1:.4f}")# XGBoost
xgb_model = xgb.XGBClassifier(random_state=42)
xgb_model.fit(X_train, y_train)
xgb_pred = xgb_model.predict(X_test)print("\nXGBoost 分類報告:")
print(classification_report(y_test, xgb_pred))
print("XGBoost 混淆矩陣:")
print(confusion_matrix(y_test, xgb_pred))xgb_accuracy = accuracy_score(y_test, xgb_pred)
xgb_precision = precision_score(y_test, xgb_pred)
xgb_recall = recall_score(y_test, xgb_pred)
xgb_f1 = f1_score(y_test, xgb_pred)
print("XGBoost 模型評估指標:")
print(f"準確率: {xgb_accuracy:.4f}")
print(f"精確率: {xgb_precision:.4f}")
print(f"召回率: {xgb_recall:.4f}")
print(f"F1 值: {xgb_f1:.4f}")# LightGBM
lgb_model = lgb.LGBMClassifier(random_state=42)
lgb_model.fit(X_train, y_train)
lgb_pred = lgb_model.predict(X_test)print("\nLightGBM 分類報告:")
print(classification_report(y_test, lgb_pred))
print("LightGBM 混淆矩陣:")
print(confusion_matrix(y_test, lgb_pred))lgb_accuracy = accuracy_score(y_test, lgb_pred)
lgb_precision = precision_score(y_test, lgb_pred)
lgb_recall = recall_score(y_test, lgb_pred)
lgb_f1 = f1_score(y_test, lgb_pred)
print("LightGBM 模型評估指標:")
print(f"準確率: {lgb_accuracy:.4f}")
print(f"精確率: {lgb_precision:.4f}")
print(f"召回率: {lgb_recall:.4f}")
print(f"F1 值: {lgb_f1:.4f}") SVM 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.60 ? ? ?0.98 ? ? ?0.74 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.67 ? ? ?0.05 ? ? ?0.10 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.60 ? ? ? 179
? ?macro avg ? ? ? 0.63 ? ? ?0.52 ? ? ?0.42 ? ? ? 179
weighted avg ? ? ? 0.62 ? ? ?0.60 ? ? ?0.48 ? ? ? 179
SVM 混淆矩陣:
[[103 ? 2]
?[ 70 ? 4]]
SVM 模型評估指標:
準確率: 0.5978
精確率: 0.6667
召回率: 0.0541
F1 值: 0.1000
KNN 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.67 ? ? ?0.84 ? ? ?0.74 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.64 ? ? ?0.41 ? ? ?0.50 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.66 ? ? ? 179
? ?macro avg ? ? ? 0.65 ? ? ?0.62 ? ? ?0.62 ? ? ? 179
weighted avg ? ? ? 0.65 ? ? ?0.66 ? ? ?0.64 ? ? ? 179
KNN 混淆矩陣:
[[88 17]
?[44 30]]
KNN 模型評估指標:
準確率: 0.6592
精確率: 0.6383
召回率: 0.4054
F1 值: 0.4959
邏輯回歸 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.79 ? ? ?0.88 ? ? ?0.83 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.79 ? ? ?0.68 ? ? ?0.73 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.79 ? ? ? 179
? ?macro avg ? ? ? 0.79 ? ? ?0.78 ? ? ?0.78 ? ? ? 179
weighted avg ? ? ? 0.79 ? ? ?0.79 ? ? ?0.79 ? ? ? 179
邏輯回歸 混淆矩陣:
[[92 13]
?[24 50]]
邏輯回歸 模型評估指標:
準確率: 0.7933
精確率: 0.7937
召回率: 0.6757
F1 值: 0.7299
樸素貝葉斯 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.83 ? ? ?0.77 ? ? ?0.80 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.70 ? ? ?0.77 ? ? ?0.74 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.77 ? ? ? 179
? ?macro avg ? ? ? 0.77 ? ? ?0.77 ? ? ?0.77 ? ? ? 179
weighted avg ? ? ? 0.78 ? ? ?0.77 ? ? ?0.77 ? ? ? 179
樸素貝葉斯 混淆矩陣:
[[81 24]
?[17 57]]
樸素貝葉斯 模型評估指標:
準確率: 0.7709
精確率: 0.7037
召回率: 0.7703
F1 值: 0.7355
決策樹 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.78 ? ? ?0.79 ? ? ?0.79 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.70 ? ? ?0.69 ? ? ?0.69 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.75 ? ? ? 179
? ?macro avg ? ? ? 0.74 ? ? ?0.74 ? ? ?0.74 ? ? ? 179
weighted avg ? ? ? 0.75 ? ? ?0.75 ? ? ?0.75 ? ? ? 179
決策樹 混淆矩陣:
[[83 22]
?[23 51]]
決策樹 模型評估指標:
準確率: 0.7486
精確率: 0.6986
召回率: 0.6892
F1 值: 0.6939
隨機森林 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.84 ? ? ?0.87 ? ? ?0.85 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.80 ? ? ?0.77 ? ? ?0.79 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.83 ? ? ? 179
? ?macro avg ? ? ? 0.82 ? ? ?0.82 ? ? ?0.82 ? ? ? 179
weighted avg ? ? ? 0.83 ? ? ?0.83 ? ? ?0.83 ? ? ? 179
隨機森林 混淆矩陣:
[[91 14]
?[17 57]]
隨機森林 模型評估指標:
準確率: 0.8268
精確率: 0.8028
召回率: 0.7703
F1 值: 0.7862
XGBoost 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.83 ? ? ?0.84 ? ? ?0.83 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.77 ? ? ?0.76 ? ? ?0.76 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.80 ? ? ? 179
? ?macro avg ? ? ? 0.80 ? ? ?0.80 ? ? ?0.80 ? ? ? 179
weighted avg ? ? ? 0.80 ? ? ?0.80 ? ? ?0.80 ? ? ? 179
XGBoost 混淆矩陣:
[[88 17]
?[18 56]]
XGBoost 模型評估指標:
準確率: 0.8045
精確率: 0.7671
召回率: 0.7568
F1 值: 0.7619
?
LightGBM 分類報告:
? ? ? ? ? ? ? precision ? ?recall ?f1-score ? support
? ? ? ? ? ?0 ? ? ? 0.82 ? ? ?0.85 ? ? ?0.84 ? ? ? 105
? ? ? ? ? ?1 ? ? ? 0.77 ? ? ?0.74 ? ? ?0.76 ? ? ? ?74
? ? accuracy ? ? ? ? ? ? ? ? ? ? ? ? ? 0.80 ? ? ? 179
? ?macro avg ? ? ? 0.80 ? ? ?0.80 ? ? ?0.80 ? ? ? 179
weighted avg ? ? ? 0.80 ? ? ?0.80 ? ? ?0.80 ? ? ? 179
LightGBM 混淆矩陣:
[[89 16]
?[19 55]]
LightGBM 模型評估指標:
準確率: 0.8045
精確率: 0.7746
召回率: 0.7432
F1 值: 0.7586
綜上比較幾種模型,感覺隨機森林更好一點,其實還能再調參或者其它的工作使得準確率更高一點
?
# 對測試集進行預測
test_pred = rf_model.predict(test)# 創建提交文件
submission = pd.DataFrame({'PassengerId': test['PassengerId'], # 從測試數據中獲取乘客ID'Survived': test_pred # 模型預測的結果
})# 保存為CSV文件
submission.to_csv('titanic_submission.csv', index=False)