标签:使用方法 core href _id rman nts sha htm 添加
Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难。目前抽工作之余,断断续续弄了点,成绩为0.79426。
在这个比赛过程中,接触并了解了一些数据挖掘比赛的基本流程,现记录一下。
关于Age,Fare,Embarked三个字段有缺失,官方给了个利用中位数或者众数的做法,同样的我们也可以利用随机森林等机器学习模型来填补缺失值。当然这里我采用的官方的做法,效果不错。
##利用众数填充Embarked缺失值prodata.Embarked[ prodata.Embarked.isnull() ] = prodata.Embarked.dropna().mode().values##利用中位数填充Age缺失值median_age = prodata[‘Age‘].dropna().median()prodata.loc[ (prodata.Age.isnull()), ‘Age‘] = median_age##根据Pclass将人分成3组,然后利用每组的中位数填充Fare缺失值median_fare = numpy.zeros(3)for f in range(0,3): median_fare[f] = prodata[prodata.Pclass == f+1 ][‘Fare‘].dropna().median()for f in range(0,3): prodata.loc[ (prodata.Fare.isnull()) & (prodata.Pclass == f+1 ), ‘Fare‘] = median_fare[f]
数据中常常有无法比较大小的值,比如Embarked代表去哪个地方,这个时候如果要使用lr这类的模型,我们需要将Embarked变为虚拟变量,也是哑变量。
举个例子:Embarked这里取得3种值,假设为A、B、C。这里我们就可以用2个新特征标识Embarked,分别是Embarked_A、Embarked_B。
Embarked = “A” => Embarked_A = 1 Embarked_B = 0
Embarked = “B” => Embarked_A = 0 Embarked_B = 1
Embarked = “C” => Embarked_A = 0 Embarked_B = 0
这里不能再添加一个新的特征Embarked_C,原因是如果在添加一个特征会使得特征完全共线性,导致模型无法估计。具体详细见虚拟变量陷阱。
##将Embarked转换为哑变量dummies_df = pandas.get_dummies(prodata.Embarked)dummies_df = dummies_df.rename(columns=lambda x:‘Embarked_‘+str(x))prodata = pandas.concat([prodata,dummies_df.iloc[:,:-1]],axis=1)
归一化的方法有很多,比如线性函数归一化,Z-score标准化。后者要求原始数据分布为正态分布。
##标准化归一化Ageprodata[‘Age_Scaled‘] = preprocessing.StandardScaler().fit_transform(prodata.Age)
将数值类的数据划分成几个区间,这里采用的分位数划分pandas.qcut。
##将Age分成6个区间,然后变化成区间idAge_bin = pandas.qcut(prodata.Age, 6)prodata[‘Age_bin_id‘] = pandas.factorize(Age_bin)[0]+1
因为Fare这一列有一些为0的数据,因此对等于0的部分,稍微做一些平滑处理。
##平滑处理Fare为0的数据prodata[‘Fare‘][numpy.where(prodata[‘Fare‘]==0)[0]] = prodata[‘Fare‘][prodata.Fare.nonzero()[0] ].min() / 100
参照博客,对lr使用了PCA降维,但是效果并不好。
X = prodata.values[:, 1::]y = prodata.values[:, 0] variance_pct = .99pca = PCA(n_components=variance_pct) X_transformed = pca.fit_transform(X,y) pcaDataFrame = pandas.DataFrame(X_transformed)
针对如此多的特征,这里可以根据随机森林在训练之后产生的一个特征重要性来筛选特征。
forest = forest.fit( train_data[0::,1::], train_data[0::,0] )feature_importance = forest.feature_importances_feature_importance = 100.0 * (feature_importance / feature_importance.max())fi_threshold = 10important_idx = numpy.where(feature_importance > fi_threshold)[0]important_features = prodata[‘‘][important_idx]print "\n", important_features.shape[0], "Important features(>", \ fi_threshold, "% of max importance)...\n"#, \ important_featuressorted_idx = numpy.argsort(feature_importance[important_idx])[::-1]get the figure about important featurespos = numpy.arange(sorted_idx.shape[0]) + .5plt.subplot(1, 2, 2)plt.title(‘Feature Importance‘)plt.barh(pos, feature_importance[important_idx][sorted_idx[::-1]], \ color=‘r‘,align=‘center‘)plt.yticks(pos, important_features[sorted_idx[::-1]])plt.xlabel(‘Relative Importance‘)plt.draw() plt.show()train_df = train_df.iloc[:, important_idx].iloc[:, sorted_idx].valuestest_df = test_df.iloc[:,important_idx
sklearn自带有cross_validation,可以进行交叉验证。具体的cross_validation用法参考:Cross-validation: evaluating estimator performance。
cross_validation.cross_val_score(lr,train_data[0::,1::],train_data[0::,0],cv=5,scoring=‘precision‘)
标签:使用方法 core href _id rman nts sha htm 添加
原文地址:http://www.cnblogs.com/D2016/p/6920632.html