用Logistic回歸分類模型判斷用戶所處運(yùn)動(dòng)狀態(tài)

基礎(chǔ)思想:
回歸模型中,y是一個(gè)定型變量械巡,比如y=0或1刹淌,logistic方法主要應(yīng)用于研究某些事件發(fā)生的概率。

優(yōu)點(diǎn):
計(jì)算代價(jià)不高讥耗,易于理解和實(shí)現(xiàn)有勾;
速度快,適合二分類問(wèn)題古程;
簡(jiǎn)單易于理解蔼卡,直接看到各個(gè)特征的權(quán)重;
能容易地更新模型吸收新的數(shù)據(jù)籍琳。

缺點(diǎn):
容易產(chǎn)生欠擬合菲宴;
分類精度可能不高;
對(duì)數(shù)據(jù)和場(chǎng)景的適應(yīng)能力有局限趋急,不如決策樹算法適應(yīng)性那么強(qiáng)

應(yīng)用領(lǐng)域:
用于二分類領(lǐng)域喝峦,可以得出概率值,適用于根據(jù)分類概率排名的領(lǐng)域呜达,如搜索排名等谣蠢;
Logistic 回歸的擴(kuò)展 softmax 可以應(yīng)用于多分類領(lǐng)域,如手寫字識(shí)別等查近;
信用評(píng)估眉踱;
測(cè)量市場(chǎng)營(yíng)銷的成功度;
預(yù)測(cè)某個(gè)產(chǎn)品的收益霜威;
特定的某天是否會(huì)發(fā)生地震谈喳。

邏輯回歸 vs 線性回歸
首先,邏輯回歸比線性回歸要好戈泼。
兩者都屬于廣義線性模型婿禽。
線性回歸優(yōu)化目標(biāo)函數(shù)用的最小二乘法,而邏輯回歸用的是最大似然估計(jì)大猛。
邏輯回歸只是在線性回歸的基礎(chǔ)上扭倾,將加權(quán)和通過(guò)sigmoid函數(shù),映射到0-1范圍內(nèi)空間挽绩。
線性回歸在整個(gè)實(shí)數(shù)范圍內(nèi)進(jìn)行預(yù)測(cè)膛壹,敏感度一致,而分類范圍,需要在[0,1]模聋。而邏輯回歸就是一種減小預(yù)測(cè)范圍肩民,將預(yù)測(cè)值限定為[0,1]間的一種回歸模型。邏輯曲線在z=0時(shí)撬槽,十分敏感此改,在z>>0或z<<0處趾撵,都不敏感侄柔,將預(yù)測(cè)值限定為(0,1)。邏輯回歸的魯棒性比線性回歸要好占调。

通過(guò)手機(jī)設(shè)備搜集的用戶運(yùn)動(dòng)數(shù)據(jù)暂题,有六個(gè)與運(yùn)動(dòng)有關(guān)的自變量,其中3個(gè)與加速度有關(guān)究珊,3個(gè)與運(yùn)動(dòng)方向有關(guān)

通過(guò)sklearn的子模塊linear_model中的Logistic回歸模型

# -----------------------第一步 建模 ----------------------- #
#導(dǎo)入第三方模塊
import numpy as np
import pandas as pd
from sklearn import linear_model
from sklearn import model_selection
#讀取數(shù)據(jù)
sports=pd.read_csv("F:\Run or Walk.csv")
sports.head()
#處理數(shù)據(jù)薪者,構(gòu)建自變量矩陣
X=sports.ix[:,sports.columns[4:]]
X.head()
#提取y變量
y=sports.activity
y.head()
#拆分?jǐn)?shù)據(jù)為訓(xùn)練集(75%)和測(cè)試集(25%)
X_train,X_test,y_train,y_test=model_selection.train_test_split(X,y,test_size=0.25,random_state=1234)
#利用訓(xùn)練集建模
sklearn_logistic=linear_model.LogisticRegression()
sklearn_logistic.fit(X_train,y_train)
#返回模型的各個(gè)參數(shù)
print(sklearn_logistic.intercept_,sklearn_logistic.coef_)
# -----------------------第二步 預(yù)測(cè)構(gòu)建混淆矩陣 ----------------------- #
# 模型預(yù)測(cè)
sklearn_predict = sklearn_logistic.predict(X_test)
sklearn_predict
# 預(yù)測(cè)結(jié)果統(tǒng)計(jì)
pd.Series(sklearn_predict).head()
pd.Series(sklearn_predict).value_counts()

其中判斷步行狀態(tài)的樣本有12121個(gè),跑步狀態(tài)的樣本有10026個(gè)

# 導(dǎo)入第三方模塊
from sklearn import metrics
# 混淆矩陣
cm = metrics.confusion_matrix(y_test, sklearn_predict, labels = [0,1])
cm

行表示實(shí)際的運(yùn)動(dòng)狀態(tài)剿涮,列表示模型預(yù)測(cè)的運(yùn)動(dòng)狀態(tài)

# -----------------------第三步 繪制ROC曲線 ----------------------- #
Accuracy = metrics.scorer.accuracy_score(y_test, sklearn_predict)
Sensitivity = metrics.scorer.recall_score(y_test, sklearn_predict)
Specificity = metrics.scorer.recall_score(y_test, sklearn_predict, pos_label=0)
print('模型準(zhǔn)確率為%.2f%%:' %(Accuracy*100))
print('正例覆蓋率為%.2f%%' %(Sensitivity*100))
print('負(fù)例覆蓋率為%.2f%%' %(Specificity*100))

整體的預(yù)測(cè)準(zhǔn)確率比較高

還可以對(duì)混淆矩陣做可視化展現(xiàn)

# 混淆矩陣的可視化
# 導(dǎo)入第三方模塊
import seaborn as sns
import matplotlib.pyplot as plt
# 繪制熱力圖
sns.heatmap(cm, annot = True, fmt = '.2e',cmap = 'GnBu')
# 圖形顯示
plt.show()

顏色越深的區(qū)塊代表樣本量越多言津,從圖中看出,主對(duì)角線上的區(qū)塊顏色要比其他地方深很多取试,說(shuō)明正確預(yù)測(cè)正例和負(fù)例的樣本數(shù)目都很大

# y得分為模型預(yù)測(cè)正例的概率
y_score = sklearn_logistic.predict_proba(X_test)[:,1]
# 計(jì)算不同閾值下悬槽,fpr和tpr的組合值,其中fpr表示1-Specificity瞬浓,tpr表示Sensitivity
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 計(jì)算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 繪制面積圖
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加邊際線
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加對(duì)角線
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x軸與y軸標(biāo)簽
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 顯示圖形
plt.show()

曲線下面積高達(dá)0.93初婆,遠(yuǎn)遠(yuǎn)超過(guò)0.8,認(rèn)定回歸模型是合理的

# -----------------------第四步 繪制K-S曲線 ----------------------- #
# 自定義繪制ks曲線的函數(shù)
def plot_ks(y_test, y_score, positive_flag):
    # 對(duì)y_test,y_score重新設(shè)置索引
    y_test.index = np.arange(len(y_test))
    #y_score.index = np.arange(len(y_score))
    # 構(gòu)建目標(biāo)數(shù)據(jù)集
    target_data = pd.DataFrame({'y_test':y_test, 'y_score':y_score})
    # 按y_score降序排列
    target_data.sort_values(by = 'y_score', ascending = False, inplace = True)
    # 自定義分位點(diǎn)
    cuts = np.arange(0.1,1,0.1)
    # 計(jì)算各分位點(diǎn)對(duì)應(yīng)的Score值
    index = len(target_data.y_score)*cuts
    scores = target_data.y_score.iloc[index.astype('int')]
    # 根據(jù)不同的Score值猿棉,計(jì)算Sensitivity和Specificity
    Sensitivity = []
    Specificity = []
    for score in scores:
        # 正例覆蓋樣本數(shù)量與實(shí)際正例樣本量
        positive_recall = target_data.loc[(target_data.y_test == positive_flag) & (target_data.y_score>score),:].shape[0]
        positive = sum(target_data.y_test == positive_flag)
        # 負(fù)例覆蓋樣本數(shù)量與實(shí)際負(fù)例樣本量
        negative_recall = target_data.loc[(target_data.y_test != positive_flag) & (target_data.y_score<=score),:].shape[0]
        negative = sum(target_data.y_test != positive_flag)
        Sensitivity.append(positive_recall/positive)
        Specificity.append(negative_recall/negative)
    # 構(gòu)建繪圖數(shù)據(jù)
    plot_data = pd.DataFrame({'cuts':cuts,'y1':1-np.array(Specificity),'y2':np.array(Sensitivity), 
                              'ks':np.array(Sensitivity)-(1-np.array(Specificity))})
    # 尋找Sensitivity和1-Specificity之差的最大值索引
    max_ks_index = np.argmax(plot_data.ks)
    plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y1.tolist()+[1], label = '1-Specificity')
    plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y2.tolist()+[1], label = 'Sensitivity')
    # 添加參考線
    plt.vlines(plot_data.cuts[max_ks_index], ymin = plot_data.y1[max_ks_index], 
               ymax = plot_data.y2[max_ks_index], linestyles = '--')
    # 添加文本信息
    plt.text(x = plot_data.cuts[max_ks_index]+0.01,
             y = plot_data.y1[max_ks_index]+plot_data.ks[max_ks_index]/2,
             s = 'KS= %.2f' %plot_data.ks[max_ks_index])
    # 顯示圖例
    plt.legend()
    # 顯示圖形
    plt.show()
# 調(diào)用自定義函數(shù)磅叛,繪制K-S曲線
plot_ks(y_test = y_test, y_score = y_score, positive_flag = 1)

中間的虛線表示在40%的分位點(diǎn),計(jì)算最大差為0.71萨赁,即KS值弊琴,大于0.4,模型擬合效果不錯(cuò)杖爽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末敲董,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掂林,更是在濱河造成了極大的恐慌臣缀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泻帮,死亡現(xiàn)場(chǎng)離奇詭異精置,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锣杂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門脂倦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)番宁,“玉大人,你說(shuō)我怎么就攤上這事赖阻〉海” “怎么了?”我有些...
    開封第一講書人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵火欧,是天一觀的道長(zhǎng)棋电。 經(jīng)常有香客問(wèn)我,道長(zhǎng)苇侵,這世上最難降的妖魔是什么赶盔? 我笑而不...
    開封第一講書人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮榆浓,結(jié)果婚禮上于未,老公的妹妹穿的比我還像新娘。我一直安慰自己陡鹃,他們只是感情好烘浦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萍鲸,像睡著了一般闷叉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猿推,一...
    開封第一講書人閱讀 49,874評(píng)論 1 290
  • 那天片习,我揣著相機(jī)與錄音,去河邊找鬼蹬叭。 笑死藕咏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秽五。 我是一名探鬼主播孽查,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坦喘!你這毒婦竟也來(lái)了盲再?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓣铣,失蹤者是張志新(化名)和其女友劉穎答朋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棠笑,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梦碗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洪规。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡印屁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斩例,到底是詐尸還是另有隱情雄人,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布念赶,位于F島的核電站础钠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晶乔。R本人自食惡果不足惜珍坊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望正罢。 院中可真熱鬧,春花似錦驻民、人聲如沸翻具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裆泳。三九已至,卻和暖如春柠硕,著一層夾襖步出監(jiān)牢的瞬間工禾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工蝗柔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闻葵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓癣丧,卻偏偏與公主長(zhǎng)得像槽畔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胁编,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容