机器学习入门(Kaggel 竞赛项目)

本文以在Kaggel上参与的Titanic生存预测项目为例,简单聊聊自己对于机器学习的理解。机器学习涉及的内容比较复杂,主要包括有监督的学习和无监督的学习,有监督的学习一般包括分类问题和回归问题,无监督学习则包括聚类问题和数据降维等。本文讨论的是有监督学习中的分类问题。

本文主要从数据的预处理、模型的选择及优化两个方面来展开。
(一)数据预处理(特征工程)
本文的数据预处理是指在使用算法模型之前,对数据进行一些整理工作。一般在较大的项目中这个步骤叫特征工程,而数据的预处理是特征工程中的一部分内容。在本文的数据预处理步骤中,主要包括对于一些缺失值、异常值的处理,数据的规范化、离散化等。主要过程在下列代码中说明。

1.读取相应的文件
    train = pd.read_csv('desktop/titanic/train.csv')
    test = pd.read_csv('desktop/titanic/test.csv')
    data_full = [train,test]
2.缺失值的处理
for dataset in data_full:
      dataset['Embarked'] = dataset['Embarked'].fillna('S') # 用众数替代空值        
      dataset['Fare'] = dataset['Fare'].fillna(dataset['Fare'].median())
      dataset.drop(['Cabin'],axis=1,inplace=True)
3.数据的离散化 按年龄段划分
 for dataset in data_full:
      dataset.loc[dataset['Age']<=16,'Age']=0
      dataset.loc[(dataset['Age']>16) & (dataset['Age']<=32),'Age'] = 1
      dataset.loc[(dataset['Age']>32) & (dataset['Age']<=48),'Age'] = 2
      dataset.loc[(dataset['Age']>48) & (dataset['Age']<=64),'Age'] = 3
      dataset.loc[(dataset['Age']>64),'Age'] = 4
4.数据的转化 将字符型数据转化为数值型数据
 for dataset in data_full:
      dataset.Name = dataset.Name.str.extract('([A-Za-z]+)\.')
 for dataset in data_full:
      dataset['Name'].replace(['Lady', 'Countess', 'Capt','Mlle','Ms','Mme', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare',inplace=True)
  for dataset in data_full:
      dataset['Sex'] = dataset['Sex'].map({"male":0,"female":1})
      dataset['Embarked'] = dataset['Embarked'].map({"S":0,"C":1,"Q":2})
      dataset['Fare'] = dataset['Fare'].astype(int)
  for dataset in data_full:
      dataset['Name']=dataset['Name'].map({"Mr":1,"Miss":2,"Miss":3,"Master":4,"Rare":5})
5.填补空值
  for dataset in data_full:
      dataset['Name'] = dataset['Name'].fillna(5)
6.转化数据类型
  for dataset in data_full:
        dataset['Name'] = dataset['Name'].astype(int)
7.删去无用数据
 for dataset in data_full:
        dataset.drop(['Ticket'],axis=1,inplace = True)
        train['Age'] = train['Age'].fillna(value=train['Age'].median())
        test['Age'] = test['Age'].fillna(value=train['Age'].median())
8.合并特征值
 for dataset in data_full:
       dataset['SibSp']=dataset['SibSp']+dataset['Parch']
 for dataset in data_full:
       dataset = dataset.drop('Parch',axis=1)

(二)模型的选择和优化

本文利用stacking的方法进行了各种模型的融合,通过不断的调整子模型和二层模型的种类,最终调试了一个还算可以的模型,在kaggel上排名top8%。
kaggel成绩.png
1.工具包的导入
from sklearn.linear_model import LogisticRegression #回归模型
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC    # 支持向量机
from sklearn.naive_bayes import MultinomialNB  # 朴素贝叶斯
from sklearn.ensemble import RandomForestClassifier  # 随机森林
from sklearn.tree import DecisionTreeClassifier     # 决策树
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import ExtraTreeClassifier 
from sklearn.ensemble import GradientBoostingClassifier  #梯度提升决策树
2.融合模型的函数实现
    初始训练集
    X_train = train[selected_features].values
    y_train = train['Survived'].ravel()
  初始测试集
  X_test = test[selected_features].values
  stacking模型融合代码
  from sklearn.model_selection import KFold
  ntrain = train.shape[0]
  ntest  = test.shape[0]
  kf = KFold(n_splits=5)
  def get_oof(clf,X_train,y_train,X_test):
       oof_train = np.zeros((ntrain,))
       oof_test  = np.zeros((ntest,))
       oof_test_skf = np.empty((5,ntest))
     for i,(train_index,test_index) in enumerate(kf.split(X_train)):
        kf_X_train = X_train[train_index]
        kf_y_train = y_train[train_index]
        kf_X_test  = X_train[test_index]
        clf.fit(kf_X_train,kf_y_train)
    
        oof_train[test_index] = clf.predict(kf_X_test)
        oof_test_skf[i,:] = clf.predict(X_test)
oof_test[:] = oof_test_skf.mean(axis=0)
return oof_train.reshape(-1,1), oof_test.reshape(-1,1)

  #算法模型的实例化
  lsvc = LinearSVC()  # 1支持向量机
  lgre = LogisticRegression(max_iter=10000) #线性回归
  xgbc = XGBClassifier()       #XGBoost
  dtr = ExtraTreeClassifier()  # 2决策树
  ran = RandomForestClassifier()  # 3随机森林
  ada = AdaBoostClassifier()      #4adaboost
  grad = GradientBoostingClassifier() #5梯度提升
  #融合函数的调用
  lsvc_oof_train, lsvc_oof_test = get_oof(lsvc, X_train, y_train, X_test) 
  dtr_oof_train,dtr_oof_test = get_oof(dtr,X_train,y_train,X_test)
  ran_oof_train,ran_oof_test = get_oof(ran,X_train,y_train,X_test)
  ada_oof_train,ada_oof_test = get_oof(ada,X_train,y_train,X_test)
  grad_oof_train,grad_oof_test = get_oof(grad,X_train,y_train,X_test)
  新的测试集
  x_train1 = np.concatenate(( lsvc_oof_train,dtr_oof_train, ran_oof_train, ada_oof_train,grad_oof_train), axis=1)
  x_test1 = np.concatenate((lsvc_oof_test,dtr_oof_test,ran_oof_test,ada_oof_test,grad_oof_test ), axis=1)

  #XGBoost模型的参数调整
  gbm = XGBClassifier(
  #learning_rate = 0.02,
       n_estimators= 2000,
       max_depth= 4,
       min_child_weight= 2,
      gamma=0.9,                        
      subsample=0.8,
      colsample_bytree=0.8,
      objective= 'binary:logistic',
      nthread= -1,
     scale_pos_weight=1)
   #模型拟合
  gbm.fit(x_train1,y_train)
  pre = gbm.predict(x_test1)
  # 数据的存储
  pd.DataFrame({ 'PassengerId': test.PassengerId, 'Survived': pre }).set_index('PassengerId').to_csv('desktop/titanic/202038a.csv')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容