数据预处理
加载数据集
import numpy as np
import pandas as pd
all_df = pd.read_csv("titanic.csv")
部分数据
提取所需要的列
cols=['survived','name','pclass','sex','age','embarked']#定义所需要的列
all_df=all_df[cols] #返回指定的列
all_df[:2]
处理完之后的部分数据
删除名字列
因为名字作为特征对预测没有任何作用
df=all_df.drop(['name'],axis=1)
数据填充并替换
在年龄字段中,有些人的年龄数据丢失了,要补上,补上的方法就是使用平均年龄。使用dataframe['column'].mean()函数处理
在舱位字段中,因为舱位是以'1st','2nd','3rd'方式保存,要输入到神经网络中,应当是转为数值
在性别字段中,都是用female和male表示,因此也要转换为整数,使用dataframe.map({映射表})函数处理
出发地有多种,可以转换为独热编码表示,使用pandas的get_dummies(dataframe,要转换的column)函数处理。
age_mean=df['age'].mean() #计算年龄均值
df['age']=df['age'].fillna(age_mean) #填充空白年龄
df['pclass']=df['pclass'].fillna('3rd') #填充空白舱位
df['pclass']=df['pclass'].map({'1st':1,'2nd':2,'3rd':3}).astype(int) #将舱位根据映射表转换为整数
df['sex']=df['sex'].map({'female':0,'male':1}).astype(int) #将性别根据映射表转换为整数
x_OneHot_df=pd.get_dummies(data=df,columns=['embarked'])#将出发地转换为独热编码表示
将DataFrame转换为矩阵表示
ndarray=x_OneHot_df.values
拆分特征集和标签集
DataFrame中可以发现,第一列都是是否生还,用0和1表示,作为标签集,之后的列都是作为特征
Label = ndarray[:,0] # ':'表示第一维的全部数据,0表示第二维的第0项
Features = ndarray[:,1:] # ':'表示第一维的全部数据,1:表示第二维的第1项以及之后所有项
将数据进行标准化
MinMaxScaler((范围)).fit_transform(矩阵) 函数可以将数据标准化,缩放到指定区间,使用时要先指定区间、再用
from sklearn import preprocessing
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))
scaledFeatures=minmax_scale.fit_transform(Features)
分离训练集和验证集
msk = np.random.rand(len(all_df)) < 0.8 #rand(n),表示生成n个0到1之间的随机数,小于0.8的作为boolan值True,是一个数组
print(msk) #对于每一项数据,都产生了一个bool类型索引
train_df = all_df[msk] #索引True加入到训练集
test_df = all_df[~msk] #索引为False的加入到测试集
np.random.rand(n) 会产生n个随机数,是一个数组
np.random.rand(n) < 0.8 则是将数组内小于0.8的作为True,大于0.8的作为False,这样就得到了一个Boolean类型数组,与n个随机数一一对应。
经过上述转换后,Boolean数组可以作为数据中的索引。
dataframe中可以使用bool索引,将索引为true的都返回。
将上述数据处理过程打包成一个函数
输入参数为一个数据集,返回这个数据集的特征集 以及 标签集
def PreprocessData(raw_df):
df=raw_df.drop(['name'],axis=1) #删除名字一列
age_mean=df['age'].mean() #求年龄的平均值
df['age']=df['age'].fillna(age_mean) #用平均值填补空白的年龄
df['pclass']=df['pclass'].fillna('3rd') #将舱位空的用3rd填充
df['pclass']=df['pclass'].map({'1st':1,'2nd':2,'3rd':3}).astype(int) #将舱位映射到整数1,2,3
df['sex']=df['sex'].map({'female':0,'male':1}).astype(int) #性别映射到整数1,2
x_OneHot_df=pd.get_dummies(data=df,columns=['embarked']) #出发地改成独热编码表示
ndarray=x_OneHot_df.values #将DataFrame转换为矩阵表示
Label = ndarray[:,0] #将所有项的第0列作为标签
Features = ndarray[:,1:] #将所有项的第1列以及以后的所有列作为特征集
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))#设置数据缩放尺度为0到1区间
scaledFeatures=minmax_scale.fit_transform(Features) #对Feature转换到0到1区间
return scaledFeatures,Label #返回压缩后的特征集以及标签集
建立模型
建立数据处理函数
from sklearn import preprocessing
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1)) #指定压缩的目标区间
def PreprocessData(raw_df):
df=raw_df.drop(['name'],axis=1)
age_mean=df['age'].mean()
df['age']=df['age'].fillna(age_mean)
df['pclass']=df['pclass'].fillna('3rd')
df['pclass']=df['pclass'].map({'1st':1,'2nd':2,'3rd':3}).astype(int)
df['sex']=df['sex'].map({'female':0,'male':1}).astype(int)
x_OneHot_df=pd.get_dummies(data=df,columns=['embarked'])
ndarray=x_OneHot_df.values #将DataFrame转换为矩阵表示
Label = ndarray[:,0] #将所有项的第0列作为标签
Features = ndarray[:,1:] #将所有项的第1列以及以后的所有列作为特征集
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))#设置数据缩放尺度为0到1区间
scaledFeatures=minmax_scale.fit_transform(Features) #对Feature转换到0到1区间
return scaledFeatures,Label #返回压缩后的特征集以及标签集
数据预处理
import urllib.request
import os
import numpy as np
import pandas as pd
all_df = pd.read_csv("titanic.csv")
cols=['survived','name','pclass','sex','age','embarked']
all_df=all_df[cols]
msk = np.random.rand(len(all_df)) < 0.8 #rand(n),表示生成n个0到1之间的随机数,小于0.8的作为boolan值True,是一个数组
print(msk) #对于每一项数据,都产生了一个bool类型索引
train_df = all_df[msk] #索引True加入到训练集
test_df = all_df[~msk] #索引为False的加入到测试集
train_Features,train_Label = PreprocessData(train_df) #分离出训练集中的 特征集 和 标签集
test_Features,test_Label=PreprocessData(test_df) #分离出测试集中的 特征集 和 标签集
建立并训练模型
from keras.models import Sequential
from keras.layers import Dense,Dropout
import matplotlib.pyplot as plt
def show_train_history(history,train,validation):
plt.plot(history.history[train])
plt.plot(history.history[validation])
plt.title('Train_History')
plt.xlabel('Epoch')
plt.ylabel(train)
plt.legend(['train','validation'],loc='upper left')
plt.show()
model = Sequential()
model.add(Dense(units=40,
input_dim=6,
kernel_initializer='uniform',
activation='relu'))
model.add(Dense(units=30,
kernel_initializer='uniform',
activation='relu'))
model.add(Dense(units=1,
kernel_initializer='uniform',
activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
train_history = model.fit(x=train_Features,
y=train_Label,
validation_split=0.1,
epochs=30,
batch_size=30,
verbose=2)
输出训练历史
show_train_history(train_history,'accuracy','val_accuracy')
show_train_history(train_history,'loss','val_loss')
评估模型准确率
scores=model.evaluate(x=test_Features,
y=test_Label)
print('模型准确率:',scores[1])
加入数据并处理数据
创建Jack和Rose数据,合并到所有数据中并预测
Jack = pd.Series([0,'Jack','3rd','male',23,'Southampton'])
Rose = pd.Series([1,'Rose','1st','female',20,'Southampton'])
JR_df = pd.DataFrame([list(Jack),list(Rose)],
columns=['survived','name','pclass','sex','age','embarked'])
all_df=pd.concat([all_df,JR_df])
all_Features,Label = PreprocessData(all_df)
输出所有预测概率
all_probability = model.predict(all_Features)
print(all_probability)
将预测概率与原表合并
Uniondf=all_df
Uniondf.insert(len(all_df.columns),'probability',all_probability)
查看生存概率大于90%但是死亡的人数据
Uniondf[(Uniondf['survived']==0) & (Uniondf['probability']>0.9) ]
标签:泰坦尼克号,Features,生存,df,age,pclass,旅客,train,history From: https://www.cnblogs.com/RedNoseBo/p/17201617.html