邏輯回歸原理和實(shí)戰(zhàn)1--揭秘美國(guó)挑戰(zhàn)者號(hào)飛船事故真相

python金融風(fēng)控評(píng)分卡模型和數(shù)據(jù)分析微專業(yè)課:http://dwz.date/b9vv

挑戰(zhàn)者號(hào)航天飛機(jī)于美國(guó)東部時(shí)間1986年1月28日上午11時(shí)39分(格林尼治標(biāo)準(zhǔn)時(shí)間16時(shí)39分)發(fā)射在美國(guó)佛羅里達(dá)州的上空。挑戰(zhàn)者號(hào)航天飛機(jī)升空后,因其右側(cè)固體火箭助推器(SRB)的O型環(huán)密封圈失效,毗鄰的外部燃料艙在泄漏出的火焰的高溫?zé)葡陆Y(jié)構(gòu)失效,使高速飛行中的航天飛機(jī)在空氣阻力的作用下于發(fā)射后的第73秒解體,機(jī)上7名宇航員全部罹難。挑戰(zhàn)者號(hào)的殘骸散落在大海中,后來(lái)被遠(yuǎn)程搜救隊(duì)打撈了上來(lái)。

這次災(zāi)難性事故導(dǎo)致美國(guó)的航天飛機(jī)飛行計(jì)劃被凍結(jié)了長(zhǎng)達(dá)32個(gè)月之久。在此期間,美國(guó)總統(tǒng)羅納德·里根委派羅杰斯委員會(huì)對(duì)該事故進(jìn)行調(diào)查。羅杰斯委員會(huì)發(fā)現(xiàn),美國(guó)國(guó)家航空航天局(NASA)的組織文化與決策過(guò)程中的缺陷與錯(cuò)誤是導(dǎo)致這次事件的關(guān)鍵因素。NASA的管理層事前已經(jīng)知道承包商莫頓·塞奧科公司設(shè)計(jì)的固體火箭助推器存在潛在的缺陷,但未能提出改進(jìn)意見。他們也忽視了工程師對(duì)于在低溫下進(jìn)行發(fā)射的危險(xiǎn)性發(fā)出的警告,并未能充分地將這些技術(shù)隱患報(bào)告給他們的上級(jí)。羅杰斯委員會(huì)向NASA提出了9項(xiàng)建議,并要求NASA在繼續(xù)航天飛機(jī)飛行計(jì)劃前貫徹這些建議。

這次事故真實(shí)原因是什么呢?真的是低溫下進(jìn)行發(fā)射引起的嗎?up主用邏輯回歸模型為大家揭秘歷史真實(shí)。
首先我們要了解什么是邏輯回歸模型。我們有一組數(shù)據(jù),包含氣溫和事故。我們要用這些數(shù)據(jù)建立邏輯回歸分類器模型。

當(dāng)構(gòu)建一個(gè)二元分類器時(shí),很多實(shí)踐者會(huì)立即跳轉(zhuǎn)到邏輯回歸,因?yàn)樗芎?jiǎn)單。但是,很多人也忘記了邏輯回歸是一種線性模型,預(yù)測(cè)變量間的非線性交互需要手動(dòng)編碼。回到欺詐檢測(cè)問(wèn)題,要獲得好的模型性能,像“billing address = shipping address and transaction amount < $50”這種高階交互特征是必須的。因此,每個(gè)人都應(yīng)該選擇適合高階交互特征的帶核SVM或基于樹的分類器。
概率定義:可能發(fā)生事件數(shù)量/所有事件數(shù)量

odd表示發(fā)生概率/不發(fā)生概率
?

odd ratio(兩個(gè)odd值相比較)

警告:odd和概率是兩個(gè)不同概念

邏輯回歸就是線性的伯努利函數(shù)

?
公式用對(duì)數(shù)函數(shù)處理

邏輯回歸是計(jì)算分類變量概率


?
?二進(jìn)制數(shù)據(jù)(分類數(shù)據(jù))不呈現(xiàn)正態(tài)分布,如果遇到極端的x取值,y預(yù)測(cè)概率可能偏差較大

對(duì)數(shù)函數(shù)可視化

對(duì)數(shù)函數(shù)里,0-1取值范圍在x軸,但我們想要概率到y(tǒng)軸,所以我們?nèi)?duì)數(shù)函數(shù)的反函數(shù)
?


?

?

邏輯回歸公式




?

?

信用得分增加對(duì)應(yīng)得odd概率增加

?
odd ratio增加可視化圖


python腳本實(shí)現(xiàn)

數(shù)據(jù)下載地址:
https://archive.ics.uci.edu/ml/datasets/Challenger+USA+Space+Shuttle+O-Ring

logisticRegression腳本代碼
?#231469242@qq.com
#微信公眾號(hào):pythonEducation
# -*- coding: utf-8 -*-
'''
GLM是廣義線性模型的一種
Logistic Regression
A logistic regression is an example of a "Generalized Linear Model (GLM)".
The input values are the recorded O-ring data from the space shuttle launches before 1986,
and the fit indicates the likelihood of failure for an O-ring.
Taken from http://www.brightstat.com/index.php?option=com_content&task=view&id=41&Itemid=1&limit=1&limitstart=2
'''
import
?numpy as np
import
?matplotlib.pyplot as plt
import
?pandas as pd
import
?seaborn as sns
????
?from
?statsmodels.formula.api?
import
?glm
from
?statsmodels.genmod.families?
import
?Binomial
sns.set_context(
'poster'
)
def
?getData():
????
'''Get the data '''
????
?????
inFile?
=
?'challenger_data.csv'
????
data?
=
?np.genfromtxt(inFile, skip_header
=
1
, usecols
=
[
1
,?
2
],
????????????????????????????????????
missing_values
=
'NA'
, delimiter
=
','
)
????
# Eliminate NaNs
????
data?
=
?data[~np.isnan(data[:,?
1
])]
????
?????
return
?data
????
?def
?prepareForFit(inData):
????
''' Make the temperature-values unique, and count the number of failures and successes.
????
Returns a DataFrame'''
????
?????
# Create a dataframe, with suitable columns for the fit
????
df?
=
?pd.DataFrame()
????
df[
'temp'
]?
=
?np.unique(inData[:,
0
])
????
df[
'failed'
]?
=
?0
????
df[
'ok'
]?
=
?0
????
df[
'total'
]?
=
?0
????
df.index?
=
?df.temp.values
????
?????
# Count the number of starts and failures
????
for
?ii?
in
?range
(inData.shape[
0
]):
????????
curTemp?
=
?inData[ii,
0
]
????????
curVal??
=
?inData[ii,
1
]
????????
df.loc[curTemp,
'total'
]?
+
=
?1
????????
if
?curVal?
=
=
?1
:
????????????
df.loc[curTemp,?
'failed'
]?
+
=
?1
????????
else
:
????????????
df.loc[curTemp,?
'ok'
]?
+
=
?1
????
?????
return
?df
def
?logistic(x, beta, alpha
=
0
):
????
''' Logistic Function '''
????
return
?1.0
?/
?(
1.0
?+
?np.exp(np.dot(beta, x)?
+
?alpha))
def
?showResults(challenger_data, model):
????
''' Show the original data, and the resulting logit-fit'''
????
temperature?
=
?challenger_data[:,
0
]
????
failures?
=
?challenger_data[:,
1
]
????
# First plot the original data
????
plt.figure()
????
setFonts()
????
sns.set_style(
'darkgrid'
)
????
np.set_printoptions(precision
=
3
, suppress
=
True
)
????
plt.scatter(temperature, failures, s
=
200
, color
=
"k"
, alpha
=
0.5
)
????
plt.yticks([
0
,?
1
])
????
plt.ylabel(
"Damage Incident?"
)
????
plt.xlabel(
"Outside Temperature [F]"
)
????
plt.title(
"Defects of the Space Shuttle O-Rings vs temperature"
)
????
plt.tight_layout
????
# Plot the fit
????
x?
=
?np.arange(
50
,?
85
)
????
alpha?
=
?model.params[
0
]
????
beta?
=
?model.params[
1
]
????
y?
=
?logistic(x, beta, alpha)
????
plt.hold(
True
)
????
plt.plot(x,y,
'r'
)
????
plt.xlim([
50
,?
85
])
????
?????
outFile?
=
?'ChallengerPlain.png'
????
showData(outFile)
?
??
?if
?__name__?
=
=
?'__main__'
:
????
inData?
=
?getData()
????
dfFit?
=
?prepareForFit(inData)
????
# fit the model
????
# --- >>> START stats <<< ---
????
model?
=
?glm(
'ok + failed ~ temp'
, data
=
dfFit, family
=
Binomial()).fit()
????
# --- >>> STOP stats <<< ---
????
print
(model.summary())
????
showResults(inData, model)
最后看到低溫時(shí),飛船發(fā)生事故較多;高溫時(shí)飛船事故較少。這也驗(yàn)證了挑戰(zhàn)者飛船事故可能就是源于低溫發(fā)射。當(dāng)然這只是從一組數(shù)據(jù)推測(cè)的,如果有其他數(shù)據(jù),也許會(huì)得到其他結(jié)論。

python機(jī)器學(xué)習(xí)生物信息學(xué)系列課(博主錄制):http://dwz.date/b9vw

