目录
数据读取
数据处理为机器学习入门基础,参考Kaggle比赛的数据库,开始简单入门数据处理,以titanic幸存者估计为例。
首先来看下训练集参数:
训练集规模为891个人的基本信息
Passengerid:表示乘客的ID
Survived:表示幸存者,0表示死亡,1表示存活
Pclass:表示该乘客所处的舱位等级,由高到低分为1,2,3等舱
Name:表示姓名
Sex:表示性别
SibSp:表示兄弟、姐妹、配偶数(sister、brother、spouse)
Parch:表示父母、孩子数(parent、chidren)
Ticket:表示乘客的船票号
Fare:表示票价
Cabin:代表乘客所在的舱位
Embarked:代表乘客登船口岸
数据处理
通过训练集参数可知,上述参数有些有缺省值,需特别注意对缺省值得处理。
查看表格中缺省值:返回值为true表示缺省,false表示不缺
#返回值为true表示缺省,false表示不缺
print(np.isnan(train_data["Age"]).any())
print(train_data.isnull().any())
print(test_data.isnull().any())
缺省值处理方式:
(1)采用0填充:data.fillna(0)
(2)删除缺省值:data.dropna(inplace=True)
需要从数据集中读取并计算性别为女性的存活率:
train_data = pd.read_csv("H:/kaggle compete/titanic/train.csv")
#单独罗列出women的存活情况
women = train_data.loc[train_data.Sex == 'female']["Survived"]
female_Survived_rate = sum(women) / len(women)
women的数据格式如下:第一列表示行索引值,这里没有行索引值,默认从0 开始,别和Passengerid搞混了,第二列表示Survived
注意到人员名称中有一系列头衔,如'Mr','Master','Major'等,所以可能职业对幸存者有一定的影响,先予以分析:
import re
import pandas as pd
import re
train_data = pd.read_csv("H:/kaggle compete/titanic/train.csv")
title_all_data = train_data.copy()
# apply:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并将元组或者字典中的参数按照顺序传递给参数
# lambda定义一个匿名函数,“:”前面的表示输入参数,后面的表示函数输出。
# str.replace('.','')表示用空字符替换掉"."
title_all_data['title'] = title_all_data.Name.apply(lambda x: re.search('\w+\.', x).group()).str.replace('.', '')
dic = {
'Mr': 'Mr',
'Mrs': 'Mrs',
'Miss': 'Miss',
'Master': 'Master',
'Don': 'Don',
'Rev': 'Rev',
'Dr': 'Dr',
'Mme': 'Mme',
'Ms': 'Ms',
'Major': 'Major',
'Lady': 'Lady',
'Sir' :'Sir',
'Mlle' : 'Mlle',
'Col' :'Col',
'Capt':'Capt',
'Countess': 'Countess',
'Jonkheer':'Jonkheer'
}
for titled_man in dic:
survived = train_data.loc[title_all_data.title == titled_man]["Survived"]
str=titled_man+":"
print(str,sum(survived) / len(survived))
# print(title_all_data.head())
# unique函数去除其中重复的元素
# print(title_all_data.title.unique())
# print(title_all_data.info())
输出:可见,职业与存活率也有一定关系
随机森林预测
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
# 读取训练数据
train_data = pd.read_csv("H:/kaggle compete/titanic/train.csv")
# 读取训练数据
test_data = pd.read_csv("H:/kaggle compete/titanic/test.csv")
y = train_data["Survived"]
#使用以下5个标签数据
features = ["Pclass", "Sex", "SibSp", "Parch", "Fare","Age"]
X = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])
#对缺省数据进行填充,这里把测试集Fare填充为0,测试集和训练集的Age填充为20
X_test["Fare"] = X_test['Fare'].fillna("0")
X_test["Age"] = X_test['Age'].fillna("20")
X["Age"] = X['Age'].fillna("20")
#采用随机森林模型进行预测
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
predictions = model.predict(X_test)
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('my_submission.csv', index=False)
print("Your submission was successfully saved!")
这样一个简单的机器学习程序在测试集的准确率在0.78468左右
原因:随机森林原理还有待进一步学习,这里仅仅进行调包操作,而且缺省值操作也是没有完全按照原则进行,如年龄就选取的很随意,参数选择也需要挑选