什么是逻辑回归?
Logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于它们的因变量不同,其他的基本都差不多。正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedlinear model)。
这一家族中的模型形式基本上都差不多,不同的就是因变量不同。如果是连续的,就是多重线性回归;
如果是二项分布,就是Logistic回归;
如果是Poisson分布,就是Poisson回归;
如果是负二项分布,就是负二项回归。
Logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最常用的就是二分类的Logistic回归。
Logistic回归的主要用途:寻找危险因素:寻找某一疾病的危险因素等;
预测:根据模型,预测在不同的自变量情况下,发生某病或某种情况的概率有多大;
判别:实际上跟预测有些类似,也是根据模型,判断某人属于某病或属于某种情况的概率有多大,也就是看一下这个人有多大的可能性是属于某病。
Logistic回归主要在流行病学中应用较多,比较常用的情形是探索某疾病的危险因素,根据危险因素预测某疾病发生的概率,等等。例如,想探讨胃癌发生的危险因素,可以选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群肯定有不同的体征和生活方式等。这里的因变量就是是否胃癌,即“是”或“否”,自变量就可以包括很多了,例如年龄、性别、饮食习惯、幽门螺杆菌感染等。自变量既可以是连续的,也可以是分类的。
分析主题?分析目的?分析结论?
最近学了Python的sklearn,结合实际用户,想建立用户流失预测模型。网上查了很多资料,针对用户流失预警模型采用决策树,逻辑回归算法比较多,当然也有使用SVM,贝叶斯算法。下面就是我根据自己工作中的一个产品作为主题,预测其用户流失与留存。流失=上个月有消费,本月无消费表流失(其实也是消费流失啦)。数据周期使用的是一两个月来做分析,什么情况下用户会消费流失?于是挑选了一些指标特征来做分析,比如上个月的消费次数、最近的消费时间(可量化),消费金额,rmf这个原理还是有一个分析依据的。当然还有其他特征如,用户观看总时长、用户活跃天数、停留时长、启动次数、等。
import pandas as pd
df=pd.read_csv('DL135667_RESULT.csv')
df_data=df.loc[:,['pay_times','pay_r','pay','all_dr','all_ndt']]
df_target=df.loc[:,['is_lost']]
X= df_data.as_matrix()
Y=df_target.as_matrix()特征工程:代码忽略,这个在数据收集和清理后已做了些分析。
针对上面选择的指标,利用决策树模型查下看看特征在分类中起到的作用大
from sklearn.ensemble import ExtraTreesClassifier
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
#利用信息熵作为划分标准,对决策树进行训练,这里做了些测试,深度设置为7效果比较好。
clf=tree.DecisionTreeClassifier(criterion='entropy',max_depth=7)
clf.fit(x_train,y_train)
#把决策树写入文件
if os.path.isdir(u'D:\\sklearn测试库'):
pass
else:
os.makedirs(u'D:\\sklearn测试库')
with open(u'D:\\sklearn测试库\\决策结果.txt','w') as f:
f=tree.export_graphviz(clf,out_file=f)
print(u'打印出特征')
expected = y_test
predicted = clf.predict(x_test)
#预测情况,精确率,召回率,f1分数等
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import ExtraTreesClassifier
#logisticrgression逻辑回归
lg_model = LogisticRegression(penalty='l2',C=1000)
a_normalized = normalize(scale(X), norm='l2') #数据标准化正则化
#特征对模型分类重要程度
model = ExtraTreesClassifier()
model.fit(a_normalized,Y)
print('feature_importances:')
print(model.feature_importances_)
#pca降维,该方法是测试下降维的效果
pca = decomposition.PCA(n_components=2)
a_pca = pca.fit_transform(a_normalized)
lx_train,lx_test,ly_train,ly_test=train_test_split(a_pca,Y,test_size=0.2)
lg_model.fit(lx_train, ly_train)
lexpected = ly_test
predicted = lg_model.predict(lx_test)
print(metrics.classification_report(lexpected, predicted))
print(metrics.confusion_matrix(lexpected, predicted))
交叉认证分#scores = cross_validation.cross_val_score(clf, raw data, raw target, cv=5, score_func=None).clf是不同的分类器,可以是任何的分类器。比如支持向量机分类器。clf = svm.SVC(kernel='linear', C=1)cv参数就是代表不同的cross validation的方法了。如果cv是一个int数字的话,并且如果提供了raw target参数,那么就代表使用StratifiedKFold分类方式,如果没有提供raw target参数,那么就代表使用KFold分类方式。cross_val_score函数的返回值就是对于每次不同的的划分raw data时,在test data上得到的分类的准确率。至于准确率的算法可以通过score_func参数指定,如果不指定的话,是用clf默认自带的准确率算法。
#交叉验证
scores = cross_validation.cross_val_score(lg_model, a_pca, Y,cv=5)#score_func=metrics.f1_score 可选择指标参数,默认自带的准确率算法。
print scores