一、导入数据库:
参考文献:Python中os.walk函数的用法(遍历文件夹下文件并获得路径)_python os.walk 用法-CSDN博客
在本次案例中应该导入数据库numpy, pandas, os,numpy用于线性函数的计算,pandas用于导入csv等数据,os用于形成获得数据的路径。
对于os.walk,完整定义为os.walk(top, topdown=True, οnerrοr=None, followlinks=False)。其中top为需要遍历目录的地址,topdown为True,则有限遍历top目录,否则优先遍历子目录(默认为topdown = True)。
os.walk是个生成器,需要遍历实现对三元组返回(root,dirs,files),但注意,os.walk中所采用的top可以是基于根目录的相对路径,也可以通过'F:\os_test'的方式调用电脑中的绝对路径。
os.path.join可以获得所有子文件路径,由于os.walk获得的并不是路径,所以需要将其内容进行连接得到路径,python自带的函数os.path.join [path1[, path2[, ...]]],其中嵌套再前面的是高级目录,后面是低级目录。
使用嵌套的遍历for循环实现和os.path.join函数对文件中所读取的文件和路径名进行存储,并保留在变量filename中。
import numpy as np
import pandas as pd
import os
for dirname, _, filenames in os.walk('../1-Day-Titanic-Random-Forest'):
for filename in filenames:
print(os.path.join(dirname, filename)
得到如下结果:
二、使用pandas库语言pd实现对csv表格的读取:
使用pandas库中的var = pd.read_csv('../1-Day-Titanic-Random-Forest/train.csv')语句实现对相对路径中的csv文件进行存储,还可以使用print(var.head())函数实现表格前几行的输出,代码如下所示:
train_data = pd.read_csv('../1-Day-Titanic-Random-Forest/train.csv')
print(train_data.head())
test_data =pd.read_csv('../1-Day-Titanic-Random-Forest/test.csv')
print(test_data.head())
得到如下结果:
三、男性、女性生存率的求解以及输出(Pandas中df.loc通过索引行和列的条件筛选出数据):
参考文献:Pandas 数据中的loc与iloc含义以及操作_df.iloc-CSDN博客
1.df.loc的操作基础:
在上述的pd.read_csv中我们实现了对两个csv文件的读取并存储,df.loc对上述读取的csv文件进行操作。
2. .loc的基本操作:
我们需要使用train_data.loc实现对条件为Sex和Survived条件的数据分层次筛选出来(先分性别,再分存活,Sex优先),在使用rate_women = sum(women)/len(women)实现对存活率的计算,最后再输出。
代码实现:
women = train_data.loc[train_data.Sex == 'female']['Survived']
rate_women = sum(women)/len(women)
print("% of women who survived:", rate_women)
men = train_data.loc[train_data.Sex == 'male']["Survived"]
rate_men = sum(men)/len(men)
print("% of men who survived:", rate_men)
我们使用Pycharm在'women = train_data.loc[train_data.Sex == 'female']['Survived']'这一行之前设置断点,然后观察其数据类型,可以在dtype那一行看到当前存储的数据类型为int,我们通过len()可以将women这个int型数据转化为数字便于求解比率。
我们再对sum()和len()这两个函数进行回顾。sum(iterable[,start]),其中iterable为可迭代的对象,在本案例中women作为可迭代对象是列表,start为指定相加的数字。len(tuple)作为统计元组的个数的函数,统计了所有女性的个数。
我们可以在women那一行代码下面先测试一下sum(women)和len(women)之间的差异。
四、使用SKlearn库中Random Forest Classifier建模:
机器学习-随机森林(RandomForest)详解-CSDN博客
sklearn.ensemble.RandomForestClassifier — scikit-learn 1.4.1 documentation
pandas - 数据离散化之 get_dummies - 知乎 (zhihu.com)
1.RandomForestClassifier模型的运用:
RF是一种常见的集成评估器模型,集成评估器中的每个模型叫做基评估器,通常由三类集成算法Bagging、Boosting、 Stacking,其中RF是Bagging的代表模型,所有的基评估器为决策树。Bagging中的每一个基决策其=器是平行的,最后的结果是采用均值或者少数服从多数的原则。
其中①n_estimators :树的数量,默认是10,这个很好理解就是你准备在你的森林里种多少树。(分类器)这个参数的大小决定了最后的准确性,但是也会让你的运行速度变的很慢,所以需要不断的测试去决定。② max_depth:树的最大深度。如果为None,则将节点展开,直到所有叶子都是纯净的(只有一个类),或者直到所有叶子都包含少于min_samples_split个样本。默认是None
2.Pandas库中函数pd.get_dummies()的应用:
pd.get_dummies()中第一项data可以为数组,列表,数据框架(array-like, serire, dataframe),get_dummies是pandas实现one hot encode的方式,将离散型特征的每一种取值看成一种状态,我们在data_train[feature]中看到数据存在Pclass、Sex、SibSp、Parch四种离散特征,one-hot保证了每个特征只有一种状态处于“激活态”,处于“激活态”的状态特征值为1。
3.代码实现:
首先导入模块RandomForestClassifier,再通过y函数将train_data[‘Survived’]种Survived一行的数据赋值给y。再设置列表features,使用pd.get_dummies函数将离散的特征值转化为0,1的特征值并且以列表的形式赋值给X,X_test。等待数值准备完毕之后采用RandomForestClassfier对X,y之间分类形成模型,最后使用model.predict()对测试数据集进行预测。
from sklearn.ensemble import RandomForestClassifier
y = train_data["Survived"]
features = ['Pclass', 'Sex', 'SibSp', 'Parch']
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
predictions = model.predict(X_test)
五、数据的输出:
通过随机森林算法,我们实现了对test_data中的幸存者进行了预测,并将预测的结果通过幸存者id和幸存概率输出为my_submission.csv。
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")