Python機器學習:泰坦尼克號獲救預測一


數據集下載地址:
視頻地址:
 
 
一、項目概要
1、應用
  模式識別、數據挖掘(核心)、統計學習、計算機視覺、語言識別、自然語言處理
 
2、模式、流程
  訓練樣本 --> 特征提取 --> 學習函數 --> 預測
二、Python實踐
1、應用的模塊
  Numpy:科學計算庫
  pandas:數據分析處理庫
  Matplotlib:數據可視化庫
  Scikit-learn:機器學習庫
 
2、數據源處理
① 導入數據:
  
1 #coding: utf-8
2 import pandas
3 titanic = pandas.read_csv('train.csv')
② 對缺失數據的列進行填充:
1 #對於缺失的數據進行補充 median 填充中位數
2 titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())
③ 屬性轉換,把某些列的字符串值轉為數字項:
1 print titanic['Sex'].unique()
2 titanic.loc[titanic['Sex'] == 'male','Sex'] = 0
3 titanic.loc[titanic['Sex'] == 'female','Sex'] = 1
4 
5 print titanic['Embarked'].unique()
6 titanic['Embarked'] = titanic['Embarked'].fillna('S')
7 titanic.loc[titanic['Embarked'] == 'S','Embarked'] = 0
8 titanic.loc[titanic['Embarked'] == 'C','Embarked'] = 1
9 titanic.loc[titanic['Embarked'] == 'Q','Embarked'] = 2
 
3、建立模型
① 引入機器學習庫,核心
1 from sklearn.linear_model import LinearRegression  #分類算法 線性回歸
2 from sklearn.cross_validation import KFold   #交叉驗證庫,將測試集進行切分驗證取平均值
② 實例化模型
1 predictors = ['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']   #用到的特征
2 alg = LinearRegression() #線性回歸模型實例化對象
3 kf = KFold(titanic.shape[0],n_folds=3,random_state=1) #將m個平均分成3份進行交叉驗證
③ 把數據傳入模型 預測結果
 1 predictions = []
 2 #for循環: 訓練集、測試集、交叉驗證
 3 for train, test in kf:
 4     #print train
 5     #print test
 6     train_predictors = (titanic[predictors].iloc[train,:]) #將predictors作為測試特征
 7     #print train_predictors
 8     train_target = titanic['Survived'].iloc[train]
 9     #print train_target
10     alg.fit(train_predictors,train_target)  #構建線性模型 樣本的x(訓練數據) 樣本的y(標簽值)
11     test_prediction = alg.predict(titanic[predictors].iloc[test,:]) #預測結果值
12     predictions.append(test_prediction)
 
4、算法概率計算
1 import numpy as np
2 #使用線性回歸得到的結果是在區間【0,1】上的某個值,需要將該值轉換成0或1
3 predictions = np.concatenate(predictions, axis=0)
4 predictions[predictions >.5] = 1
5 predictions[predictions <=.5] = 0
6 accury = sum(predictions[predictions == titanic['Survived']]) / len(predictions) #測試准確率 進行模型評估
7 print accury #精度值
 
5、集成算法 構造多個分類樹
① 構造多個分類器
1 from sklearn.linear_model import LogisticRegression #邏輯回歸
2 from sklearn import cross_validation
3 alg = LogisticRegression(random_state=1)
4 scores = cross_validation.cross_val_score(alg, titanic[predictors],titanic['Survived'],cv=3)
5 print scores.mean()
② 隨機森林
 1 from sklearn.ensemble import RandomForestClassifier
 2 from sklearn import cross_validation
 3 predictions = ['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked']
 4 # Initialize our algorithm with the default paramters
 5 # random_state = 1 表示此處代碼多運行幾次得到的隨機值都是一樣的,如果不設置,兩次執行的隨機值是不一樣的
 6 # n_estimators  指定有多少顆決策樹,樹的分裂的條件是:
 7 # min_samples_split 代表樣本不停的分裂,某一個節點上的樣本如果只有2個了 ,就不再繼續分裂了
 8 # min_samples_leaf 是控制葉子節點的最小個數
 9 alg = RandomForestClassifier(random_state=1,n_estimators=100,min_samples_split=4,min_samples_leaf=2)
10 #進行交叉驗證
11 kf = cross_validation.KFold(titanic.shape[0],n_folds=3,random_state=1)
12 scores = cross_validation.cross_val_score(alg,titanic[predictors],titanic['Survived'],cv=kf)
13 print scores.mean()

 

6、特征提取
 1 # ## 關於特征提取問題 (非常關鍵)
 2 # - 盡可能多的提取特征
 3 # - 看不同特征的效果
 4 # - 特征提取是數據挖掘里很- 要的一部分
 5 # - 以上使用的特征都是數據里已經有的了,在真實的數據挖掘里我們常常沒有合適的特征,需要我們自己取提取
 6 ① 把多個特征組合成一個特征
 7 titanic['Familysize'] = titanic['SibSp'] + titanic['Parch'] #家庭總共多少人
 8 titanic['NameLength'] = titanic['Name'].apply(lambda x: len(x)) #名字的長度
 9 import re
10 
11 def get_title(name):
12     title_reserch = re.search('([A-Za-z]+)\.',name)
13     if title_reserch:
14         return title_reserch.group(1)
15     return ""
16 titles = titanic['Name'].apply(get_title)
17 #print pandas.value_counts(titles)
18 
19 #將稱號轉換成數值表示
20 title_mapping = {"Mr":1,"Miss":2,"Mrs":3,"Master":4,"Dr":5,"Rev":6,"Col":7,"Major":8,"Mlle":9,"Countess":10,"Ms":11,"Lady":12,"Jonkheer":13,"Don":14,"Mme":15,"Capt":16,"Sir":17}
21 for k,v in title_mapping.items():
22     titles[titles==k] = v
23     #print (pandas.value_counts(titles))
24 titanic["titles"] = titles #添加title特征
② 進行特征選擇
 1 # 進行特征選擇
 2 # 特征重要性分析
 3 # 分析 不同特征對 最終結果的影響
 4 # 例如 衡量age列的重要程度時,什么也不干,得到一個錯誤率error1,
 5 # 加入一些噪音數據,替換原來的值(注意,此時其他列的數據不變),又得到一個一個錯誤率error2
 6 # 兩個錯誤率的差值 可以體現這一個特征的重要性
 7 import numpy as np
 8 from sklearn.feature_selection import SelectKBest,f_classif#引入feature_selection看每一個特征的重要程度
 9 import matplotlib.pyplot as plt
10 
11 predictors = ['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked','Familysize','NameLength','titles']
12 selector = SelectKBest(f_classif,k=5)
13 selector.fit(titanic[predictors],titanic['Survived'])
14 scores = -np.log10(selector.pvalues_)
③用視圖的方式展示
1 plt.bar(range(len(predictors)),scores)
2 plt.xticks(range(len(predictors)),predictors,rotation='vertical')
3 plt.show()

 
7、集成分類器
 1 # 在競賽中常用的耍賴的辦法:集成多種算法,取最后每種算法的平均值,來減少過擬合
 2 from sklearn.ensemble import GradientBoostingClassifier
 3 import numpy as np
 4 # GradientBoostingClassifier也是一種隨機森林的算法,可以集成多個弱分類器,然后變成強分類器
 5 algorithas = [
 6         [GradientBoostingClassifier(random_state=1,n_estimators=25,max_depth=3),['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked','Familysize','NameLength','titles']],
 7         [LogisticRegression(random_state=1),['Pclass','Sex','Age','SibSp','Parch','Fare','Embarked','Familysize','NameLength','titles']]
 8         ]
 9 kf = KFold(titanic.shape[0],n_folds=3,random_state=1)
10 predictions = []
11 for train, test in kf:
12    train_target = titanic['Survived'].iloc[train]
13    full_test_predictions = []
14    for alg,predictors in algorithas:
15        alg.fit(titanic[predictors].iloc[train,:],train_target)
16        test_prediction = alg.predict_proba(titanic[predictors].iloc[test,:].astype(float))[:,1]
17        full_test_predictions.append(test_prediction)
18    test_predictions = (full_test_predictions[0] + full_test_predictions[1]) / 2
19    test_predictions[test_predictions >.5] = 1
20    test_predictions[test_predictions <=.5] = 0
21    predictions.append(test_predictions)
22 predictions = np.concatenate(predictions,axis=0)
23 accury = sum(predictions[predictions == titanic['Survived']]) / len(predictions)#測試准確率
24 print accury

 

 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM