参考文章点击打开链接
首先读取很多很多包和数据
#-*-coding:utf-8-*-
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt
train=pd.read_csv('C:/kaggle/Titanic/train.csv')
test=pd.read_csv('C:/kaggle/Titanic/test.csv')
训练集中有两个上船位置的数据缺失,我们做一个简单的统计,发现一等舱的乘客在S港口上船的几率更大一些,所以我们将训练数据中上船位置的缺失诗句用S来补充,并将test中的一个缺失元素利用均值补上。
train=pd.read_csv('C:/kaggle/Titanic/train.csv')
test=pd.read_csv('C:/kaggle/Titanic/test.csv')
y1=train[train.Embarked=='C'].groupby('Pclass')['Pclass'].count()
y2=train[train.Embarked=='Q'].groupby('Pclass')['Pclass'].count()
y3=train[train.Embarked=='S'].groupby('Pclass')['Pclass'].count()
y=[y1,y2,y3]
#print y #统计各个港口各船舱级别上船人数
train.Embarked.fillna('S') #将缺失数据用S进行填充
#print test.loc[test.Fare.isnull()]
test.Fare.fillna(test[(test.Pclass==1)&(test.Embarked=='S')].Fare.mean(),inplace=True)#将test中的一个缺失元素利用均值补上上
对数据进行基本的处理,将拥有船舱号和没有船舱号分开,在删除姓名和票号列。
train['Cabin']=train['Cabin'].isnull().apply(lambda x:'Null'if x is True else 'Not Null') #用isnull判断是否缺失,若缺失则为True,再将true替换为null,将False替换为Not Null
test['Cabin']=test['Cabin'].isnull().apply(lambda x:'Null'if x is True else 'Not Null') #lambda是匿名函数
del train['Name'],train['Ticket'] #删除name列和ticket列
del test['Name'],test['Ticket']
将年龄分类,连续型变量离散化。
def age_map(x):
if x<10:
return '10-'
if x>60:
return '60+'
elif x>=10 and x<60:
return '%d-%d'%(x//5,x//5+5)
else:
return 'Null'
train['Age_map']=train['Age'].apply(lambda x:age_map(x))
print train['Survived'].groupby(train['Age_map']).count() #统计各个年龄段的人数
将价格进行标准化,并将数据组合在一起,进行onehot编码。onehot是一种特殊的编码形式,如果是只与类别有关,而与大小无关的数据适合用onehot编码,例如男女,或者第一类第二类,但是人数这种和数字大小有关的数据就用数字即可。
#train.Fare是行数据,reshape将行数据转化为列数据在进行标准化
scaler=preprocessing.StandardScaler().fit(train.Fare.values.reshape(-1,1))
#通过StandardScaler将train数据和test数据同时进行同样的标准化
train.Fare=scaler.transform(train.Fare.values.reshape(-1,1))
test.Fare=scaler.transform(test.Fare.values.reshape(-1,1))
train_x=pd.concat([train[['SibSp','Parch','Fare']],pd.get_dummies(train[['Pclass','Sex','Cabin','Age_map','Embarked']])],axis=1)
train_y=train.Survived
test_x=pd.concat([train[['SibSp','Parch','Fare']],pd.get_dummies(train[['Pclass','Sex','Cabin','Age_map','Embarked']])],axis=1)#使用get_dummies进行one hot编码
关于Plotting Learning Curves的官方用法点击打开链接
关于grid_search.GridSearchCV的官方用法点击打开链接
Plotting Learning Curves主要是画张图用来判断是否过拟合和欠拟合。过拟合现象主要是由于高方差造成的,而欠拟合现象是由于高偏差造成的。高方差的解决方法是使用更多的样本,或者更少的特征,而高偏差的解决方法是使用更多的特征,或者改变一些特征。
grid_search.GridSearchCV主要是用做对于模型求解最优参数的一个方法。
def plot_learning_curve(clf, title, x, y, ylim=None, cv=None, n_jobs=1,train_sizes=np.linspace(.05, 1., 5)):
train_sizes, train_scores, test_scores = learning_curve(clf, x, y,train_sizes=train_sizes)
# 输入:
# (estimator: 分类器。
# title: 表格的标题。
# X: 输入的feature,numpy类型
# y: 输入的target
# vector
# ylim: tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点
# cv: 做cross - validation的时候,数据分成的份数,其中一份作为cv集,其余n - 1份作为training(默认为3份)
# n_jobs: 并行的的任务数(默认1))
# 输出:(train_sizes_abs:训练样本数
# train_scores:训练集上准确率
# test_scores:交叉验证集上的准确率)
train_scores_mean = np.mean(train_scores, axis=1) #计算训练数据,测试数据的平均数,标准差
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
plt.figure().add_subplot(111)
plt.title(title)
if ylim is not None: #调整图像中y值的最高点
plt.ylim(*ylim)
plt.xlabel("train_num_of_samples")
plt.ylabel("score")
plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std,
alpha=0.1, color="b") #画出曲线的边界沿线
plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std,
alpha=0.1, color="r")
plt.plot(train_sizes, train_scores_mean, 'o-', color="b", label="train score")
plt.plot(train_sizes, test_scores_mean, 'o-', color="r", label="testCV score")
plt.legend(loc="best")
plt.grid()
plt.show()
return plt
param={'penalty':['l1','l2'],'C':[0.1,0.5,1.0,5.0]}
#penalty代表惩罚项的方法,l1正则化和l2正则化,L1正则化是指权值向量ww中各个元素的绝对值之和,L2正则化是指权值向量ww中各个元素的平方和然后再求平方根
#C中的数值表示正则化强度,值越大正则化反而越小
grd=GridSearchCV(estimator=LogisticRegression(),param_grid=param,cv=5,n_jobs=1)
#cv代表k折交叉验证,n_jobs代表并行运算
grd.fit(train_x,train_y)
plot_learning_curve(grd, 'learning_rate', train_x, train_y)
gender_submission = pd.DataFrame({'PassengerId':test.iloc[:,0],'Survived':grd.predict(test_x)})
gender_submission.to_csv('C:/kaggle/Titanic/gender_submission.csv', index=None)
最后将excel提交到kaggle上就可以啦~