python做logistic回归分析,我觉的使用statsmodel库比较好,结果输出比较整齐。很类似传统的统计软件。
比如使用 kaggel 的heart数据集。
地址在:https://www.kaggle.com/zhaoyingzhu/heartcsv
###############################################################
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv("binary.csv")
df.head()
df
# 重命名 ranks 列,
df.columns = ['admit', 'gre', 'gpa', 'prestige']
df
pd.crosstab( df['prestige'],df['admit'])
df.hist()
# 这里产生了一个虚拟变量数据表。
dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')
dummy_ranks
type(dummy_ranks)
dummy_ranks.shape
df.shape
clos_to_keep = ['admit', 'gre', 'gpa']
clos_to_keep
# 这里,需要保留3个虚拟变量。n个虚拟的,纳入回归就纳入n-1,否则完全共线
data = df[clos_to_keep].join(dummy_ranks.loc[:, 'prestige_2':])
data
#产生一个截距项。
data['intercept'] = 1.0
data
# 从第二列开始,数据中的列是自变量,第一列是y
train_cols = data.columns[1:]
train_cols
# 这里使用、logit函数,更简单一点
logit = sm.Logit(data['admit'], data[train_cols])
result = logit.fit()
result.summary()
# 当然也可以使用广义线性模型,这有点类似于R的一些语法
model = sm.GLM.from_formula('admit~gre + gpa +prestige_2 +prestige_3 +prestige_4 ',
family = sm.families.Binomial(), data = data)
m1 = model.fit()
m1.summary()
# 两种方法,结果相同
##################################
############ 添加截距项,也可以使用 sm的add——constant功能
##################################
df = pd.read_csv("binary.csv")
df.head()
df.keys()
df.columns = ['admit', 'gre', 'gpa', 'prestige']
df.head()
data_dummy = pd.get_dummies(df['prestige'], prefix="prestige")
data_dummy
df_new = df.iloc[:, :-1].join(data_dummy.iloc[:, 1:])
df_new
independent = sm.add_constant(df_new.iloc[:, 1:])
independent
dependent = df_new.iloc[:, 0]
dependent
model = sm.Logit(dependent, independent).fit()
model.summary()
# 结果也是一样的。