本周學(xué)習(xí)了邏輯回歸的原理思路躺翻,利用歷史考期成績(jī)對(duì)學(xué)生本輪考試是否通過(guò)進(jìn)行預(yù)測(cè)丧叽。以下為數(shù)據(jù)涉及字段:
省份,學(xué)生ID公你,考期踊淳,科目,分?jǐn)?shù)陕靠,描述迂尝,是否通過(guò),小組剪芥,班主任垄开,學(xué)院名稱,家族税肪,子訂單id溉躲,預(yù)估分,分?jǐn)?shù)區(qū)間寸认。
以上字段中签财,描述/考期/子訂單id/學(xué)生id/分?jǐn)?shù)區(qū)間經(jīng)業(yè)務(wù)考慮屬于無(wú)效或重復(fù)字段。
數(shù)據(jù)清洗部分省略偏塞,以下進(jìn)行模型的數(shù)據(jù)處理唱蒸。
一. 離散特征的處理
df.loc[df['分?jǐn)?shù)']>=60,'target']=1
df.loc[df['分?jǐn)?shù)']<60,'target']=0
df.head(5)
二. 連續(xù)特征標(biāo)準(zhǔn)化
from sklearn.linear_model import stochastic_gradient
from sklearn.cross_validation import StratifiedKFold
cat_columns=['省份','科目','小組','班主任','學(xué)員名稱','家族']
num_columns=['預(yù)估分']
target_column='target'
encode_df=pd.get_dummies(df,columns=cat_columns)
df_x=encode_df.drop(columns=target_column)
df_y=encode_df[target_column]
df_y=df_y.values
num_mean=df_x[num_columns].mean()
num_std=df_x[num_columns].std()
num_normal=(df_x[num_columns]-num_mean)/num_std
df_x = df_x.drop(columns=num_columns) # 刪除沒(méi)有歸一化的數(shù)值型數(shù)據(jù)
df_x = pd.concat([df_x,num_normal],axis = 1) # concat歸一化數(shù)據(jù)
df_x = df_x.values
三. 訓(xùn)練/測(cè)試:數(shù)據(jù)集劃分
from sklearn.model_selection import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(n_splits=2,train_size=0.7)
for train_index,test_index in sss.split(df_x,df_y):
trainx,testx = df_x[train_index],df_x[test_index]
trainy,testy = df_y[train_index],df_y[test_index]
四. 構(gòu)建模型
from sklearn.linear_model import SGDClassifier #梯度下降
lr = SGDClassifier(loss="log",max_iter = 100) #最大迭代次數(shù)少 100.
lr.fit(trainx,trainy)
五.測(cè)試模型效果
from sklearn.metrics import roc_auc_score,precision_recall_curve,classification_report,roc_curve
pred = lr.predict_proba(testx)[:,1] #預(yù)測(cè)概率
pred_labels = lr.predict(testx) #預(yù)測(cè)0,1值
# ROC
print(roc_auc_score(testy,pred)) #預(yù)測(cè)roc曲線下的面積:0.907
# 分類(lèi)報(bào)告
print(classification_report(testy,pred_labels))
precision,recall,_ = precision_recall_curve(testy,pred) #pre灸叼,recall神汹,閾值。
plt.plot(recall,precision)
# roc curve
fpr,tpr,_ = roc_curve(testy,pred) #繪制roc曲線
plt.plot(fpr,tpr)