关于Keras
Keras是一个开放源码的高级深度学习程序库,其主要作者和维护者是Google公司的工程师FrancoisChollet,以MIT开放源码方式授权。相对于TensorFlow这样低级的链接库,Keras可以使用更少的代码和时间来完成深度学习模型的组建。目前,Keras提供了两种后端引擎:Theano与TensorFlow。
电影数据挖掘的对象为《泰坦尼克号》,数据集下载:
http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.xls
code:
import numpy #模块导入
import pandas as pd
from sklearn import preprocessing
numpy.random.seed(10)
all_df =pd.read_excel("data/titanic3.xls")
cols=['survived','name','pclass' ,'sex', 'age', 'sibsp',
'parch', 'fare', 'embarked']
all_df=all_df[cols]
msk = numpy.random.rand(len(all_df)) < 0.8
train_df = all_df[msk]
test_df = all_df[~msk]
def PreprocessData(raw_df): #数据集预处理
df=raw_df.drop(['name'], axis=1)
age_mean = df['age'].mean()
df['age'] = df['age'].fillna(age_mean)
fare_mean = df['fare'].mean()
df['fare'] = df['fare'].fillna(fare_mean)
df['sex']= df['sex'].map({'female':0, 'male': 1}).astype(int)
x_One Hot_df = pd.get_dummies(data=df,columns=["embarked" ])
ndarray = x_One Hot_df.values
Features = ndarray[:,1:]
Label = ndarray[:,0]
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1))
scaledFeatures=minmax_scale.fit_transform(Features)
return scaledFeatures,Label
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
model = Sequential() #建立keras模型
model.add(Dense(units=40, input_dim=9,kernel_initializer='uniform',activation='relu')) #输入层,隐藏层1
model.add(Dense(units=30, kernel_initializer='uniform', activation='relu')) #隐藏层2
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, #90%作训练数据,10%数据验证
epochs=30, #30个训练周期
batch_size=30,verbose=2) #每次训练处理30项数据,并显示训练过程
图一:数据验证的准确率
接下来添加主角Jack和Rose的数据,根据电影剧情,我们作如下的数据设定:
1). Jack是3等舱,Rose是头等舱。2). Jack是男性,Rose是女性。
1). Jack票价是5,Rose票价是100。1). Jack年龄是23,Rose年龄是20。
所以,有:
Jack = pd.Series([0 ,'Jack',3, 'male' , 23, 1, 0, 5.0000,'S'])
Rose = pd.Series([1 ,'Rose',1, 'female', 20, 1, 0, 100.0000,'S'])
JR_df = pd.DataFrame([list(Jack),list(Rose)],
columns=['survived', 'name','pclass', 'sex',
'age', 'sibsp','parch', 'fare','embarked'])
all_df=pd.concat([all_df,JR_df])
接下来进行预测:
all_Features,Label=PreprocessData(all_df)
all_probability=model.predict(all_Features)
pd=all_df
pd.insert(len(all_df.columns),
'probability',all_probability)
pd[-2:] #预测Jack and Rose 的生存概率
pd[(pd['survived']==0) & (pd['probability']>0.9) ] #查看生存几率高,却没有存活的数据
图二:Jack and Rose的计算结果
由计算结果可以看出,基本上与电影结局是符合的。另外,查看一下特殊数据:计算出的生存几率高,却没有活下来的案例:
图三
图四
数据结果中,Allison,Miss. Helen Loraine,Mrs. Hudson J C.都是Allison家族的人,在真实案例中,Allison家族的故事是:Allison一家人共4人,爸爸(30岁),妈妈(25岁),女儿Loraine(2岁),婴儿Trevor(不满1岁)。他们全家加上一个护士(Alice Cleaver)乘坐邮轮返回加拿大蒙特利尔。因为搭乘救生艇女士优先,原本妈妈可以带着女儿与小婴儿上救生艇,但因为找不到婴儿Trevor,所以坚持不上救生艇,而在床上到处寻找婴儿,最后全家遇害。
造化弄人的是,原来婴儿早被护士带上救生艇,但没有告知Allison家人,导致全家找不到婴儿。最后影儿Trevor被送回到加拿大,由他的叔叔婶婶抚养长大。
survivednamepclasssexagesibspparchfareembarked00Jack3male23.0105.0S11Rose1female20.010100.0S