24/9/3算法笔记 kaggle泰坦尼克
题目:
这次我用两种算法做了这道题
逻辑回归二分类算法
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score,classification_report
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, LabelEncoder
读入数据
train_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\train.csv")
test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
**这边有一点我居然现在才懂,训练模型后面会拆分为一部分的训练和一部分的测试模型用来训练模型,而不是用所给的测试数据来做
然后接下来是固定的特征处理,处理不需要的特征,我的理解就是和预测的目标特征无关的,然后将有些字符串可以用独热编码一系列操作合并。
还有就是特征缩放,特征缩放可以帮助算法更有效地收敛,并提高模型的性能。这里用的是最小-最大缩放
data = train_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)
划分训练集和测试集
from sklearn.model_selection import train_test_split
X=data.drop('Survived',axis=1)
y=data['Survived']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
然后使用逻辑回归模型
from sklearn.linear_model import LogisticRegression
LR=LogisticRegression()
LR.fit(X_train,y_train)
print('训练集准确率:\n',LR.score(X_train,y_train))
print('验证集准确率:\n',LR.score(X_test,y_test))
同样的测试数据也要进行相同的特征处理,一开始没做,然后报错了。
**哦对在,查看别的大佬的时候我看见了一个大佬不一样的特征处理,他将不同情况的人分成
不同段的人(比如Mr,Miss,Master等),非常有意思。
下面是我的训练集的处理
test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
data = test_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)
最后就可以预测测试集了
y_pred = LR.predict(data)
print(y_pred)
结合数据保存
df = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
# 提取 'PassengerId' 列
passenger_ids = df['PassengerId']
result=pd.DataFrame({'PassengerId':passenger_ids ,'Survived':y_pred.astype(np.int32)})
result.to_csv('combined_columns.csv', index=False)
此算法的分数是
还有用了决策树算法
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
import graphviz
from sklearn.model_selection import train_test_split
from sklearn import tree
import pandas as pd
train_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\train.csv")
test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
data = train_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)
和二分类不一样的是这边多提取了一个特征名称这一步
#划分训练集和测试集,既预留一部分数据(30%),用于评估模型。
from sklearn.model_selection import train_test_split
X=data.drop('Survived',axis=1)
y=data['Survived']
feature_names = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked_Q','Embarked_S']
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
使用模型
model = DecisionTreeClassifier()
model.fit(X_train,y_train)
画出决策树
#构建决策树
dot_data = tree.export_graphviz(model,filled = True,rounded = True,feature_names = feature_names)
graphviz.Source(dot_data)
model.fit(X_train,y_train)
print('训练集准确率:\n',model.score(X_train,y_train))
print('验证集准确率:\n',model.score(X_test,y_test))
测试集特征处理
test_data = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
data = test_data
#删除一些无关信息
data.drop(['Name','PassengerId','Ticket','Cabin'],axis=1,inplace=True)
data['Age']=data['Age'].fillna(data['Age'].mean())
data['Fare']=data['Fare'].fillna(data['Fare'].mean())
data['Embarked']=data['Embarked'].fillna(data['Embarked'].value_counts().index[0])
#将性别与登船港口进行独热编码
dumm=pd.get_dummies(data[['Sex','Embarked']],drop_first=True)
data=pd.concat([data,dumm],axis=1)
data.drop(['Sex','Embarked'],axis=1,inplace=True)
#数据缩放
data['Age']=(data['Age']-data['Age'].min()) / (data['Age'].max()-data['Age'].min())
data['Fare']=(data['Fare']-data['Fare'].min()) / (data['Fare'].max()-data['Fare'].min())
print(data)
模型预测
y_pred = model.predict(data)
print(y_pred)
df = pd.read_csv("C:\\Users\\91144\\Desktop\\kaggle比赛数据\\泰坦尼克\\titanic\\test.csv")
# 提取 'PassengerId' 列
passenger_ids = df['PassengerId']
result=pd.DataFrame({'PassengerId':passenger_ids ,'Survived':y_pred.astype(np.int32)})
result.to_csv('决策树combined_columns.csv', index=False)
最后的分数
两个算法的对比
逻辑回归:
- 模型相对简单,易于理解和解释。
- 特征权重可以直接解释为特征对事件发生概率的影响。
- 线性模型,用于二分类问题,可以输出事件发生的概率。
- 可以处理特征之间存在线性关系的情况。
- 相对于决策树,逻辑回归通常更不容易过拟合。
- 可以通过正则化技术(如L1或L2正则化)来控制模型复杂度。
- 通常需要一些技巧来处理多分类问题,如“一对多”(One-vs-Rest)策略。
- 通常需要对缺失数据进行处理,如填充或删除。
决策树:
- 非线性模型,可以处理更复杂的决策边界。
- 通过树状图的形式进行决策,可以直观地展示特征之间的非线性关系。
- 模型可能非常复杂,具有很高的灵活性。
- 易于可视化,决策过程直观,但可能难以解释深层次的逻辑。
- 容易过拟合,尤其是在特征数量多于训练样本的情况下。
- 需要剪枝(pruning)或其他技术来控制模型复杂度。
- 可以直接处理多分类问题。
- 可以输出每个类别的概率,但这些概率的解释可能不如逻辑回归直观。
- 可以处理缺失数据,甚至可以在分裂时使用缺失数据作为条件。