在此总结编写Titanic baseline程序,包括编写思路与程序实现
pandas库的使用
1.设置显示宽度
pd.set_option('display.max_columns', 500, 'display.width', 1000)
2.pandas读取csv文件使用函数read_csv(),函数参数较多,往往用一个记一个,在此直接填入要加载哪个文档就好。
3.读取的csv文件有header的话,pd读取将数据创建为DataFrame,相当于数据库中一张表,比如可进行groupBy操作,然后进行count操作。
g_SibSp = data_train.groupby(['Parch', 'Survived'])
df_SibSp = pd.DataFrame(g_SibSp.count()['PassengerId'])
4.提取数据中某些列
df[['Age', 'Fare', 'Parch', 'SibSp', 'Pclass']]
多列要用[]再括起来
也可使用函数filter,可搭配正则表达式。
df_test.filter(regex='Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
也可使用age_df[age_df.Age.notnull()]
。这样直接可对选中的列进行操作,比如判断是否为空,不为空notnull(),为空isnull(),比如判断是否等于某个值。
data_train.Embarked[data_train.Survived == 0].value_counts()
value_count函数进行计数。
还可使用loc函数定位,这样可以直接赋值。
df.loc[(df.Cabin.notnull()), 'Cabin'] = "Yes"
多个条件筛选时用多个[]
data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3]
5.对df数据进行切片时需要将数据转为array。使用函数values。同样要使用矩阵的一些操作,比如reshape也需要转换一下。
train_np = train_df.values
# y即Survival结果
y = train_np[:, 0]
# x即特征属性
X = train_np[:, 1:]
6.进行数据连接
df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1) # 表横向连接
7.删除数据
df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True) # 去除原来的列
8.get_dummies函数进行one-hot编码
dummies_Cabin = pd.get_dummies(data_train['Cabin'], prefix='Cabin')
9.将结果保存为csv文件
result = pd.DataFrame({'PassengerId': data_test['PassengerId'].values, 'Survived': predictions.astype(np.int32)})
result.to_csv("logistic_regression_predictions.csv", index=False) # 保存csv
首先生成DataFrame,然后调用to_csv函数,不需要index。
matplotlib画图
1.显示中文字符设置
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 10
2.画柱状图
fig = plt.figure()
fig.set(alpha=0.2) # 透明度设置
plt.subplot2grid((2, 3), (0, 0)) # 2*3格,第一张图
data_train.Survived.value_counts().plot(kind='bar') # 获救人数柱状图
plt.title("获救情况(1为获救)")
plt.ylabel("人数")
subplot2grid用来灵活布局显示多张图片。第四行直接将某一列不同类型计数并画成柱状图,非常的方便。
3.画散点图
plt.subplot2grid((2, 3), (0, 2))
plt.scatter(data_train.Survived, data_train.Age) # 散点图,横坐标是否存活,纵坐标年龄
plt.ylabel("年龄")
plt.grid(b=True, which='major', axis='y') # b设置网线,which默认'major',绘制y方向的网线
plt.title("按年龄看获救情况")
使用scatter函数,设置横坐标与纵坐标即可。grid用来设置网格。
4.密度分布曲线
plt.subplot2grid((2, 3), (1, 0), colspan=2) # 横向两格
# kernel density estimate(核密度估计)
data_train.Age[data_train.Pclass == 1].plot(kind='kde')
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel("年龄")
plt.ylabel("密度")
plt.title("各等级的年龄分布")
plt.legend(("1等仓", "2等仓", "3等仓"), loc='best') # loc显示位置,best自适应
只要改变kind值为kde即可。
5.显示同一x值下不同y值的大小的柱状图,这种柱状图视觉效果明显。
survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df = pd.DataFrame({"获救": survived_1, "未获救": survived_0})
df.plot(kind='bar', stacked=True)
plt.title("各乘客等级的获救情况")
plt.xlabel("乘客等级")
plt.ylabel("人数")
步骤是先生成一个DataFrame,然后调用函数df.plot(kind='bar', stacked=True)。
transpose()函数可进行反转。
df = pd.DataFrame({"获救": survived_1, "未获救": survived_0}).transpose()
6.
data_train.Survived[data_train.Sex == 'male'][data_train.Pclass != 3].value_counts().plot(kind='bar', label='male high class', color='lightblue')
数据多条筛选与plot多个参数设置。
sklearn的preprocessing.StandardScaler()使用
函数目的是将一些变化幅度较大的特征化到[-1,1]之间,这样可以加速logistic regression回归。
使用分为三步:
scaler = preprocessing.StandardScaler()
age_scale_param = scaler.fit(df['Age'].values.reshape(-1, 1)) # 输入时2D的,如果是单一feature要reshape(-1,1),values是转化为array,用来计算数据特征,有时这一步可以省略。
df['Age_scaled'] = scaler.fit_transform(df['Age'].values.reshape(-1, 1), age_scale_param) # 关键是这一步,后面一个参数可以没有。
不用每次都创建scaler,创建一次即可。注意点是要进行array转化并reshape(-1, 1),-1是当前不用指定多少行。按要求依次调用fit,fit_trainsform即可。
fit与fit_transform参数
当数据量比较大时,比如在训练集中,去除第二步也是可以的,直接使用fit_trainsform。但当数据量不大时,比如在test数据集中,需要第二步产生的平均值,方差参数来对test的数据进行变化。
利用sklearn.ensemble的RandomForestRegressor进行数据填充
基本步骤:
# y目标年龄
y = know_age[:, 0]
# X 特征属性
X = know_age[:, 1:]
# fit到RandomForestRegressor中
rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1) # 单独说明
rfr.fit(X, y)
# 用得到的模型进行未知年龄结果预测
predicted_ages = rfr.predict(unknow_age[:, 1::])
# 用的到的预测结果填充原缺失数据
df.loc[(df.Age.isnull()), 'Age'] = predicted_ages
先划分目标值y,特征属性X,再生成模型RanddomForestRegressor,其中有较多参数:
random_state : int, RandomState instance or None, optional (default=None)
fit函数
If int, random_state is the seed used by the random number generator; If RandomState instance, random_state is the random number generator; If None, the random number generator is the RandomState instance used by np.random.
n_estimators : integer, optional (default=10)
The number of trees in the forest.
n_jobs : integer, optional (default=1)
The number of jobs to run in parallel for both fit and predict. If -1, then the number of jobs is set to the number of cores.
主要用到两个函数fit与predict
predict函数
使用sklearn的linear_model进行数据预测
基本用法:
# y即Survival结果
y = train_np[:, 0]
# x即特征属性
X = train_np[:, 1:]
# fit到LogisticRegression中
clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6) # 单独分析
clf.fit(X, y)
test_df = df_test.filter(regex='Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
predictions = clf.predict(test_df)
用法基本与RanddomForestRegressor类似,先是目标数据y,特征属性X的划分,调用linear_model.LogisticRegression生成模型,fit函数输入训练数据,predict函数预测数据。
RandomForestClassifier的用法也是如此,经测试,单模型下LogisticRegression(0.76555)效果比RandomForestClassifier(0.72727)效果好。
至此,Titanic baseline用到的方法总结完毕,对于随机森林分类,随机森林回归,线性回归模型的原理介绍及参数调优将在以后介绍。
网友评论