如何運用sklearn做邏輯回歸預測
運用sklearn做邏輯回歸預測
邏輯回歸算是機器學習中最基礎的模型了,回歸模型在做分類問題中有著較好的效果。
下面介紹下利用sklearn做邏輯回歸模型做模型一般分為:
提取數據---->了解數據(所謂的探索性數據)---->數據預處理(包括但不限于填充缺失值,特征提取,轉換啞變量)---->選擇模型---->驗證模型---->模型優(yōu)化
下面先簡單介紹下邏輯回歸的原理
說到邏輯回歸就不得不提一下線性回歸,線性回歸用wiki百科的定義來解釋就是:在統計學中,線性回歸是一種用來建立響應標量(因變量)和一個或多個解釋變量(自變量)之間的模型關系的線性方法。
線性回歸分為一元線性回歸和多元線性回歸。
均方誤差是回歸模型中常用的度量方法。一般用最小二乘法來最小化均方誤差。
線性回歸用的最多的是做預測,而邏輯回歸最適合的有二分預測,比如是否垃圾郵件,廣告是否點擊等等;今天的模型用kaggle比賽中的泰坦尼克預測數據集來做邏輯回歸模型,故此次我們做的是監(jiān)督學習。
1.在數據集從kaggle中下載后我們先讀取數據和數據預覽
通過DataFrame的函數info(),我們可以詳細看到數據的分布等情況
import pandas as pd
train=pd.read_csv('D:\\pycm\\kaggle\\titanic\\train.csv',index_col=0) #read train data
test=pd.read_csv('D:\\pycm\\kaggle\\titanic\\test.csv',index_col=0) #read test data
print(train.info()) #show the information about train data,including counting values of null
2.了解數據
查看數據中的缺失值
print(train.isnull().sum()

發(fā)現數據中缺失數據Age有177個,Cabin 有687個,Embarked 有2個;由于Cabin 缺失數據占比太大了,我們看下這列數據缺失部分和有值部分對是否獲救的情況是如何的,來判斷該特征是否需要直接刪除。
c=train.Cabin.value_counts() #get the value of Cabin print(c) train.drop(labels=Cabin,axis=1)
3.數據處理
看了下結果發(fā)現都是一些客艙號,由于不具有很大的參考意義,在這里我直接把這個特征舍棄掉。
另一個列Embarked是登船的港口,有2個缺失值,我們用出現頻率最多的值來填充
train.Embarked=train.Embarked.fillna('S')
Em=train.Embarked.value_counts()
print(Em)接下來是Age有177個缺失值,
由于年齡和姓名相關,我們首先把未缺失的值按照姓名的簡稱來做下均值分類
train['cc']=train.Name.map(lambda x: str(re.compile(r',(.*)\.').findall(x)))#獲取名字中的簡稱字樣Mr,Miss,Mrs,Master,Dr等值
#替換上面的寫法:train['cc']=train['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())
c=train.loc[:,['cc','Age']].query('Age>0').groupby('cc').mean() #按照名稱輔助列看下各年齡的均值最后我們看到結果如下:

在這里我們對缺失值的年齡填充根據姓名簡稱的均值來進行填充
train['Age']=train['Age'].fillna(0)#先對缺失值進行0填充
for i in range(1,891):
if train['Age'][i]==0 and train['cc'][i]=="[' Mr']":
train.loc[i, 'Age']=32
if train['Age'][i]==0 and train['cc'][i] =="[' Mrs']":
train.loc[i, 'Age']= 35
if train['Age'][i]==0 and train['cc'][i] == "[' Miss']":
train.loc[i, 'Age']=20
if train['Age'][i]==0 and train['cc'][i] == "[' Master']":
train.loc[i, 'Age']= 4
if train['Age'][i]==0 and train['cc'][i] == "[' Dr']":
train.loc[i,'Age']=42另一種寫法,如下:
value=['Mr','Miss','Mrs','Master','Dr']
for v in value:
train.loc[(train.Age==0)&(train.cc==v),'Age']=c.loc[v,'Age']到這里我們就把缺失值處理完了,下面我們對類別值進行處理,我們先看下目前有哪些特征是類別
categore=train.dtypes[train.dtypes=='object'].index
結果為:

我們看到,目前有年齡,船票和登船口是類別型的,這里我們對年齡和登船口做變量賦值
train=train.replace({'Sex':{'male':1,'female':2},
'Embarked':{'S':1,'C':2,'Q':3}}
)后面我們把Name,Ticket等無意義的字段直接刪掉
data=data.drop(labels=['cc','Name','Ticket'],axis=1)
到這里就數據處理完啦。由于kaggle數據都是直接把train,test給我們的,所以我一般會前期把train數據集和test數據集放一起做數據處理。
這里前面我們可以在最初做數據拼接操作
data=pd.concat([train,test],keys=(['train','test']))
最后對所有的數據處理完后把數據分開
train_data=data.xs('train')#分開得到level 為train的測試數據
test_data=data.xs('test').drop(labels='Survived',axis=1)
x_train=train_data.drop(labels='Survived',axis=1)
y_train=train_data['Survived']
test_data=test_data.fillna(0)4.選擇模型
本次的特征較少,我們就不做特別的特征選取了, 對數據處理完后就直接進入模型階段,這次我們在這里講解Logistics回歸模型。
首先對模型做均一化處理
from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression
S=StandardScaler()
S.fit(x_train)
x_train_stand=S.transform(x_train)
x_test_stand=S.transform(test_data)
Log=LogisticRegression(C=10)
Log.fit(x_train_stand,y_train) #訓練模型
prediction=Log.predict(x_test_stand) #用訓練的模型Log來預測測試數據
result=pd.DataFrame({'PassengerId':test_data.index,'Survived':prediction.astype(np.int32)}) #這里需要注意把prediction的數據轉換成Int型不然系統判定不了,得分會為0
result.to_csv('D:\\pycm\\kaggle\\titanic\\result.csv',index=False) #設置不輸出Index最后將得到的結果提交,就完成啦,

后面還可以對模型進行優(yōu)化,調參,我們放到下一期來進行講解。這期講解邏輯回歸就先到這里,我們以一個是否生存的預測問題結尾。
最后附上完整代碼:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import re
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
train=pd.read_csv('D:\\pycm\\kaggle\\titanic\\train.csv',index_col=0) #讀文件
test=pd.read_csv('D:\\pycm\\kaggle\\titanic\\test.csv',index_col=0)
data=pd.concat([train,test],keys=(['train','test']))
print(data.info())
data.Embarked=data.Embarked.fillna('S')
data=data.drop(labels='Cabin',axis=1)
#data['cc']=data.Name.map(lambda x: str(re.compile(r',(.*)\.').findall(x)))
data['cc']=data['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())
c=data.loc[:,['cc','Age']].query('Age>0').groupby('cc').mean()
print(c.loc['Miss','Age'])
value=['Mr','Miss','Mrs','Master','Dr']
data['Age']=data['Age'].fillna(0)
for v in value:
data.loc[(data.Age==0)&(data.cc==v),'Age']=c.loc[v,'Age']
data=data.drop(labels=['cc','Name','Ticket'],axis=1)
data=data.replace({'Sex':{'male':1,'female':2},
'Embarked':{'S':1,'C':2,'Q':3}}
)
train_data=data.xs('train')
test_data=data.xs('test').drop(labels='Survived',axis=1)
x_train=train_data.drop(labels='Survived',axis=1)
y_train=train_data['Survived']
test_data=test_data.fillna(0)
S=StandardScaler()
S.fit(x_train)
x_train_stand=S.transform(x_train)
x_test_stand=S.transform(test_data)
Log=RandomForestClassifier(oob_score=True,random_state=10)
Log.fit(x_train_stand,y_train)
prediction=Log.predict(x_test_stand)
result=pd.DataFrame({'PassengerId':test_data.index,'Survived':prediction.astype(np.int32)})
result.to_csv('D:\\pycm\\kaggle\\titanic\\result.csv',index=False)總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python GUI庫圖形界面開發(fā)之PyQt5單選按鈕控件QRadioButton詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5單選按鈕控件QRadioButton詳細使用方法與實例,需要的朋友可以參考下2020-02-02
django數據模型中null和blank的區(qū)別說明
這篇文章主要介紹了django數據模型中null和blank的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09

