logistic模型预测人口python_基于python的logistic回归建模预测
1、背景
泰坦尼克號是當時世界上體積最龐大、內部設施最豪華的客運輪船,有“永不沉沒”的美譽 。然而不幸的是,在它的處女航中,泰坦尼克號便遭厄運。1912年4月10日,泰坦尼克號從英國南安普敦(Southampton)出發,途經法國瑟堡-奧克特維爾(Cherbourg-Octeville)以及愛爾蘭昆士敦(Queenstown),駛向美國紐約。1912年4月14日23時40分左右,泰坦尼克號與一座冰山相撞,造成右舷船艏至船中部破裂,五間水密艙進水。次日凌晨2時20分左右,泰坦尼克船體斷裂成兩截后沉入大西洋底3700米處。2224名船員及乘客中,逾1500人喪生。這么多人遇難的原因之一是沒有準備足夠的救生艇。
2、.提出問題
研究的問題:什么樣的人在泰坦尼克號中更容易存活?
3.理解數據
3.1采集數據
3.2查看官網上對變量的解釋:
這里有個大致了解即可。
3.3理清分析思路和需求
【a】提出問題
【b】理解數據:導入數據—理解數據—數據集信息
【c】數據清洗:數據預處理(刪除重復值、填充缺失值)— 特征提取 — 特征選擇
【d】構建模型
【e】提交預測
3.4數據理解、準備、數據清洗
3.4.1導入數據查看數據集大小
train.csv比test.csv多了一列Survived,即是否生存,這正是我們要解決的問題:本文即是通過對train.csv的機器學習,來預測test.csv的Survived水平。因此,后面會基于train.csv提取特征并結合其Survived數據來預測,則test.csv的數據特征在預測的時候一定要與train.cs的特征數據一致。只有test.csv的特征與訓練數據train.csv的特征一致時才能直接應用訓練模型進行預測,這樣才保證test.csv的特征數據可直接帶入進行預測。所以要將二者合并起來一起清洗
3.4.2數據集信息
結論:1309行,12列,與前兩個數據集的行之和、列數相符,說明合并成功。
3.4.3刪除重復值
3.4.4查看數據集信息和缺失值情況
3.4.5理解數據缺失值
在前面理解數據階段,我們發現數據總共有1309行。
數據類型列:年齡(Age)、船票價格(Fare)里面有缺失數據;而生成情況(Survived)這一列是標簽,要預測的數據標簽是未知的,不需要處理這一列
字符串列:船艙號(Cabin)和登船港口(Embarked)里面有缺失數據。
這為我們下一步數據清洗指明了方向,只有知道哪些字段缺失數據,我們才能有針對性的處理。很多機器學習算法為了訓練模型,要求所傳入的特征中不能有空值。
3.4.6處理缺失值
常見方法主要是:
如果是數值類型,用平均值取代;如果是分類數據,用最常見的類別取代;使用模型預測缺失值,例如:KNN。
(a)首先我們對數值型字段進行查看和處理,步驟如下:
結果顯示與前文分析的缺失值一致,表示目前是進程正確,下面進行數據清洗部分
依據處理數據類型缺失值—用平均數來填充缺失值的辦法對數值型數據缺失值進行填充
(b)其次我們對字符串類型字段進行查看和處理,步驟如下:
依據處理字符串類型缺失值—用最常見的類別取代的辦法對分類型數據缺失值進行填充
處理船艙號(Cabin)這列的缺失值:船艙號(Cabin)這列的缺失值很多,缺失值填充為U,表示未知(Unknow)
處理登船港口(Embarked)這列的缺失值:登船港口(Embarked)這列總數1307,缺失了2條數據,缺失很少,找出最常見的類別,用其填充
從結果來看,登船港口(Embarked)列,S類別最常見。 我們將缺失值填充為最頻繁出現的值:S=英國南安普頓Southampton,并檢查處理后的數據情況
(c)生成情況(Survived)這一列是標簽,要預測的數據標簽是未知的,不需要處理這一列
4、特征工程
數據分析、機器學習中,最重要的就是選取合適的數據特征,供模型算法訓練。若訓練的特征相關性高,則能事半功倍,故而特征工程是整個項目的核心所在,這一步做得好后面模型的正確率就高。那么什么是特征工程?特征工程就是最大限度地從原始數據中提取能表征原始數據的特征,以供機器學習算法和模型使用。下面,結合本例中的變量,先對其進行分類,然后逐個提取特征。
4.1特征提取
4.1.1一般步驟:原始數據—數據分類處理—特征提取(或特征降維后特征提取)—特征選擇—構建模型;其中主要是特征提取(降維)和特征選擇。
其中對各個變量分類后的處理辦法如下:
(a)數值類型—直接使用
(b)分類數據—用數值代替類別one-hot編碼
(c)序列數據—轉成單獨的年、月、日
4.1.2根據前文的info可知,可分類數據--解讀如1)、其他類型數據—解讀如2)
1)分類數據:
乘客性別(Sex):男性male,女性female
登船港口(Embarked):出發地點:S=英國南安普頓Southampton,途徑地點1:C=法國瑟堡市Cherbourg,出發地點2:Q=愛爾蘭昆士敦Queenstown
客艙等級(Pclass):1=1等艙,2=2等艙,3=3等艙
2)數值、字符串類型數據: 乘客編號(PassengerId),年齡(Age),船票價格(Fare),同代直系親屬人數(SibSp),不同代直系親屬人數(Parch),客艙號(Cabin)、姓名(Name),船票(Ticket);
4.1.3對以上字段提取特征,具體過程如下:
船票(Ticket)表示的是船票號,由于我們會對乘客的等級做特征處理,故這里不需要處理Ticket數據,剩余字段數據特征提取思路如下:
[a]性別(Sex)
處理性別sex,數據Sex在原數據中填充的是female、male,為了方便后面模型訓練,將其轉換成數值型的0、1:
如上所示,轉換成功。到這里,完成了sex列數據特征的提取。這里要特別注意的是map函數,其表示把其之前的對象按后面的規則逐個映射一遍,后面也將用到map函數,要特別掌握。
[b]登船港口(Embarked)
處理登錄港口Embarked,首先看Embarked數據的前五行,了解數據列內容分布情況:
Embarked顯示的是乘客在那個港口登陸,而這又是類別數據,這時可用one-hot編碼對這一列數據進行降維。即:給登陸港口C、S、Q分別建一列,如果是在該港口登陸則值為1,否則為0。這樣每個乘客,即每一行,只會在三列中的一列為1,其余為0,這就實現了類別數據向數值型數據的額轉化,且也實現了數據降維。
具體可用pandas的get_dummies方法實現,使用get_dummies進行one-hot編碼,產生虛擬變量(dummy variables),列名前綴是Embarked
如上EmbarkedDF就是轉換后的Embarked數據,將其添加到full中,并刪除原full中的Embarked列,到這里,完成了Embarked列數據特征的提取。
需要強調的一點是,contact具有合并數據的功能(axis=1表示按列合并),但python中并不是只有這一個函數具有合并功能,各個函數合并的特點各異,詳見下面兩篇文章:
[c]客艙等級(Pclass)
處理船艙等級Pclass,官網中介紹Pclass分為高中低,數值分別對應為1、2、3,與Embarked數據一致,也對其用get_dummies方法實現one-hot編碼
首先看Pclass數據的前五行,并了解數據列內容分布情況:
對pclass列數據內容進行降維,并查看降維后的結果
到這里,完成了Pclass列數據特征的提取。
[d]姓名(Name)中提取頭銜
先看Name數據列內容和內容分布情況:
仔細觀察發現,每一個Name中都含有稱謂,如Mr,Mrs,Miss等,可用split分割字符串提取出來,其中,可用strip方法去除稱謂的前綴、后綴,本文中的前后綴是空格。接下來定義函數,把Name列的所有元素都按上述方法處置:
得到這些稱謂如上圖所示,對提取后的稱謂進行統計,看有多種,每種出現的次數分別是多少?
如上所示,這些稱謂很多,有些出現的次數很少,這不足以將人群分類。有沒有更加簡潔的分類,將上述稱謂分類,以便更加直觀的反應乘客的社會地位?經網上查西方人對頭銜的分類,可將頭銜分為6類Officer,Royalty,Master,Mr,Mrs,Miss六種,這樣將大大的簡化乘客身份的分類。所以,定義字典,并用map函數完成上述轉換,如下:
接下來,將titleDF更新到full中,以便后面繼續分析用:
到這里,完成了Name列數據特征的提取。
[e]客艙號(Cabin)中提取客艙類別
先看cabin數據列內容和內容分布情況:
仔細觀察可見,Cabin數據列并不規整,但也不是全無規律可循,可取每個元素的首字母進行填充,然后用新的首字母進行one-hot編碼生存特征數據CabinDF,最后更新到full中。
這里要重點注意一個重要的知識點匿名函數lambda,上圖代碼中"lambda c:c[0]"表示返回c的第一個元素,再結合map函數,表示對"full['Cabin']"中的每一個元素都應用一下該匿名函數,即返回首字母,從而實現提取首字母的目的。關于匿名函數lambda,這里不再詳述。這是個重要的知識點,在python中經常用到,其能用一行代碼實現函數定義,非常實用。
繼續用get_dummies方法實現one-hot編碼,如下:
將CabinDF更新到full中,并刪除full中的Cabin列,則船艙號Cabin數據特征也準備好了,如下
到這里,完成了cabin列數據特征的提取。
[f] Parch,SibSp--建立家庭人數和家庭類別
先理解下這兩個數據是什么意思:
SibSp:表示船上兄弟姐妹數和配偶數量,理解為同代直系親屬數量,
Parch:表示船上父母數和子女數,理解為不同代直系親屬數量。
據此,這兩個數據可用來衡量乘客的家庭大小,而家庭的大小規模 會影響乘客的生還幾率,因此可創建衡量家庭規模的變量familySize。familySize應等于:同代直系親屬數量SibSp+不同代直系親屬數量Parch+乘客本人,則有:
如上圖所示,可計算出乘客在船上的家庭人數familySize,但此時的familySize各不相同,沒有標準,這并不能直接反應出家庭的規模,因此根據familySize的大小將家庭數量分為大、中、小三種,當familySize為1時,認定其為小型家庭;當人數為2至4人時認定其為中等家庭;當人數大于等于5人時認定其為大型家庭。如下:
到這里,可將FamilyDF添加到full中,而Parch,SibSp數據可以刪除也可不刪除,本文沒有刪除,后面計算相關系數的時候再看,并不影響后面的分析。至此,Parch,SibSp數據特征準備好了。
數值型數據有Age,Fare,PassengerId列,其中PassengerId表示乘客的編號,在提交文件中有涉及,不適合做特征;Age,Fare的數值可直接作為數據特征使用。所以,至此完成了所有數據特征的提取。
4.2特征確認:
我們看一下此時的full,都有哪些特征。
如上所示,共有37列。
接下來我我們將獲取這些特征之間的相關性,并敲定選取哪些特征作為樣本訓練的特征。
5.獲取特征相關性
第四章中獲取的眾多數據特征,互相之間的是否相關?更進一步,是否生存Survived與哪些特征相關?這是本章要解決的問題。
5.1 首先獲取corr矩陣
用dataframe的corr方法,獲取full中所有元素之間的相關性矩陣corrDF:
圖片很大,這里沒能全部顯示。然而我們的重點是獲取Survived與各個元素之間的相關性,則提取Survived與各個數據的相關系數,并按降序排列,如下:
5.2特征選擇
各個相關系數如上,根據正負相關性強弱,根據各個特征與生成情況(Survived)的相關系數大小,選擇下列幾個特征作為模型的輸入:頭銜(titleDf)、客艙等級(pclassDf)、家庭大小(familyDf)、船票價格(Fare)、船艙號(cabinDf)、登船港口(embarkedDf)、性別(Sex),年齡(Age),至此,根據相關性選取特征也準備好了。
6,準備建模數據
這里有個重要的問題要理清楚,就是各個數據集的作用。首先,就是要分清楚用于訓練的特征數據source_x和標簽數據source_y,這倆必須含有上述特征和標簽Survived數據;
同時full中還含有test.csv的數據,這一部分數據沒有Survived列。本文正是要預測這一部分Survived情況,因此將full中test.csv部分提取出來,重命名為預測數據特征pre_x,以備后面預測用。
建立訓練數據集和測試數據集,用訓練數據和某個機器學習算法得到機器學習模型,用測試數據評估模型。
理清了思路之后,開始準備各個數據集:樣本特征數據是用于模型訓練的,應含完整的選中特征,即28列數據;
樣本標簽數據是用于模型根據樣本特征數據的特征與樣本標簽數據的一一對應關系來訓練模型用的,故只有Survived列數據這一列,但其行數一定與樣本特征數據的行數一致;
預測特征數據是后面帶入到預測模型進行預測其預測標簽的,故其形式一定要與樣本特征數據一致,否則后面一定會出錯。如果你做到這一步發現二者不一致,立刻停下來檢查,否則后面走不通。
這一步至關重要,一定要理解清楚。這里整通了之后,后面完成后就可用train_test_split拆分樣本數據為訓練數據train和測試數據test,其中訓練數據train用于模型訓練,而測試數據test用于測試該訓練的效果。
此時,可放慢腳步,兩個數據集的特征和標簽,對應樣本特征數據和樣本特征標簽再進一步理解下,一定要理清思路再往后做,這樣后面才能心如明鏡。準備好上述這些數據后,就可以開始建立模型,并訓練了。
7.構建模型
選擇邏輯回歸算法建立模型
用sklearn的linear_model的邏輯回歸算法建立模型,并開始用拆分好的數據進行訓練:
8.模型的評估、預測
8.1 模型正確率評估
用模型model的score方法,查看其正確率,看看該模型預測的test_y與預留的test_y對比后,正確的比例有多少:
模型的正確率為79.3%,表明擬合的相對理想,正確率高,可以使用來預測。
8.2 用模型進行預測
將前面準備的預測數據特征pre_x,用模型的predict方法預測生存數據pre_y,并整理成整數型int數據:
8.3 按項目要求收集數據
第一章中下載好的三個數據集中的''gender_submission.csv''根據官網釋義,這個是要提交的預測數據的要求格式,則我們上傳的數據應與這個樣式數據完全一致,其中的列名“PassengerId”“Survived”的大小寫也應完全一致,否則系統會因無法讀取數據而報錯。 使用預測數據集得到預測結果,并保存到csv文件中,上傳到Kaggle中,就可以看到得分。
將預測結果上傳到Kaggle,得分為0.7655。
至此,本項目已經全部做完了。后續再優化項目,用其他模型預測.
總結
以上是生活随笔為你收集整理的logistic模型预测人口python_基于python的logistic回归建模预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小秘书的福音——使用Word VBA打造
- 下一篇: 51单片机毕业设计题目大全