sklearn-监督学习-分类与回归

一、分类模型
1.KNN算法
函数:KNeighborsClassifier()
思路:对k个最近的邻居进行拟合,调试出最佳n_neighbors的值,分别对训练集、验证集、测试集的标记值与预测值进行拟合,用参数accuracy_score \recall_score \f1_score 对拟合效果进行评定。

from sklearn.metrics import accuracy_score,recall_score,f1_score
from sklearn.neighbors import NearestNeighbors,KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train,Y_train)
from sklearn.metrics import accuracy_score,recall_score,f1_score
print('Train')
Y_pred = knn_clf.predict(X_train)
print('ACC',accuracy_score(Y_train,Y_pred))
print('REC',recall_score(Y_train,Y_pred))
print('F-Score',f1_score(Y_train,Y_pred))
Y_pred = knn_clf.predict(X_validation)
print('Validation')
print('ACC',accuracy_score(Y_validation,Y_pred)) #准确率
print('REC',recall_score(Y_validation,Y_pred)) #召回率
print('F-Score',f1_score(Y_validation,Y_pred)) #F值
Y_pred = knn_clf.predict(X_test)
print('Test')
print('ACC',accuracy_score(Y_test,Y_pred))
print('REC',recall_score(Y_test,Y_pred))
print('F-Score',f1_score(Y_test,Y_pred))

2.朴素贝叶斯算法
函数:GaussianNB(), BernoulliNB()
思路:将上述代码进行优化,建立models的list,将模型以元组形式存入list,用classifier name 和 classifier循环遍历models,分类拟合得到分类数组和标签,然后建立训练集、验证集、测试集及其对应标记值的list;循环遍历每个xy_lst的元素,遍历过程中将数组与标签分开,并进行预测。最后通过评定参数accuracy_score、recall_score、f1_score,print预测值与标记值的准确率

from sklearn.metrics import accuracy_score,recall_score,f1_score
from sklearn.naive_bayes import GaussianNB,BernoulliNB
#用贝叶斯方法时,数据为离散值的情况下可能表现会更好一些
#高斯朴素贝叶斯(假设特征是高斯分布的),伯努利朴素贝叶斯(值是离散值用这个方法,如果是连续值要用伯努利进行二值化)
models = []
models.append(('GaussianNB',GaussianNB()))
models.append(('BernoulliNB',BernoulliNB()))

for clf_name,clf in models:
    clf.fit(X_train,Y_train)
    xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
    for i in range(len(xy_lst)):
        X_part = xy_lst[i][0]
        Y_part = xy_lst[i][1]
        Y_pred = clf.predict(X_part)
print(i)
print(clf_name,'--ACC',accuracy_score(Y_part,Y_pred))
print(clf_name,'--REC',recall_score(Y_part,Y_pred))
print(clf_name,'--F_score',f1_score(Y_part,Y_pred))

3.决策树
函数:DecisionTreeClassifier()
思路:决策树模型有两种方法,一个是用Gini系数,另一个是用entropy信息熵

from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.externals.six import StringIO
models = []
models.append(('DecisionTreeGini',DecisionTreeClassifier(min_impurity_split=0.1)))  # min_impurity_split=0.1 最小不纯度,一种减枝方法
models.append(('DecisionTreeEntropy',DecisionTreeClassifier(criterion='entropy')))  # 信息增益方法的决策树
for clf_name,clf in models:
    clf.fit(X_train,Y_train)
    xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]
    for i in range(len(xy_lst)):
        X_part = xy_lst[i][0]
        Y_part = xy_lst[i][1]
        Y_pred = clf.predict(X_part)
        print(i)
        print(clf_name,'--ACC',accuracy_score(Y_part,Y_pred))
        print(clf_name,'--REC',recall_score(Y_part,Y_pred))
        print(clf_name,'--F_score',f1_score(Y_part,Y_pred))
        dot_data = StringIO() #使用StringIO
        export_graphviz(clf,out_file=dot_data,
                            feature_names=f_names,
                            class_names=['NL','L'],
                            filled=True,
                            rounded=True,
                            special_characters=True)
        graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
        graph.write_pdf('dt_tree2.pdf')
tree

4.支持向量机SVM算法
函数:SVC()
思路:先映射,再在低维空间计算,再用核函数扩维

from sklearn.svm import SVC
models.append(('SVM Classifier',SVC(C=1000))) #通过C可以控制计算的准确性

5.集成方法(ensemble)一随机森林算法(Bagging)
函数:RandomForestClassifier()
思想:每个决策树可以并不使用全部特征,不需要剪值,即可有效避免过拟合。通过对训练数据集进行随机采样,以重新组合成不同的数据集,利用弱学习算法对不同的新数据集进行学习,得到一系列的预测结果,对这些预测结果做平均或者投票做出最终的预测。

from sklearn.ensemble import RandomForestClassifier
models.append(('OriginalForest',RandomForestClassifier()))  #默认n_estimators=10, 特征自动选取
models.append(('RandomForest',RandomForestClassifier(max_features=None)))  #取全部特征

6.集成方法(ensemble)一Adaboost 算法(Boosting)
函数:AdaBoostClassifier()
思想:通过对样本进行不同的赋值,对错误学习的样本的权重设置的较大,这样在后续的学习中集中处理难学的样本,最终得到一系列的预测结果,每个预测结果有一个权重,较大的权重表示该预测效果较好。

from sklearn.ensemble import AdaBoostClassifier
# n_estimators 弱学习的分类器的数量,默认50;base_estimator 默认为决策树
models.append(('AdaBoost',AdaBoostClassifier(base_estimator=SVC(),n_estimators=100,algorithm='SAMME')))

二、回归模型
1.线性回归: LinearDiscriminantAnalysis()
2.岭回归: Ridge()
3.Lasso回归: Lasso()

from sklearn.linear_model import LinearRegression,Ridge,Lasso
regr = LinearRegression()
regr = Ridge(alpha=0.8)  #用岭回归可以得到控制参数规模的作用,但作用不是很明显
regr = Lasso(alpha=0.002) #通过控制参数的规模而达到一个更好的拟合效果
regr.fit(features.values,label.values)
Y_pred = regr.predict(features.values)
print('coef',regr.coef_)  #看下拟合过后的参数
from sklearn.metrics import mean_squared_error #平均平方误差
print('MSE',mean_squared_error(Y_pred,label.values))

4.逻辑回归: LogisticRegression()
主要用于线性可分的数据集

from sklearn.linear_model import LogisticRegression
models.append(('LogisticRegression',LogisticRegression(C=1000,tol=1e-10,solver="sag",max_iter=10000)))
# 如果效果不好,可以通过调参来优化;

5.人工神经网络: 用Keras进行实现
主要用于非线性数据,主要应用于图像识别,语音识别,自然语言处理等

from keras.models import Sequential # Sequential 人工神经网络的容器,而这个容器是序列化(层级化)的

from keras.layers.core import Dense,Activation # Dense 稠密层(神经网络层),Activation激活函数

from keras.optimizers import SGD # SGD是随机梯度下降算法

mdl = Sequential()

mdl.add(Dense(50,input_dim=len(f_v[0]))) # 先建一个稠密层表示输入层,在输入每一层的时候只需要表示输出就可以了,\

#只有在输入层的时候需要表示输入,输出代表下一个隐含神经元的个数,\

#先指定下一个隐含神经元的个数,eg:50;输入维度与输入数据维度保持一致

mdl.add(Activation('sigmoid'))

mdl.add(Dense(2)) # 输出维度设定

mdl.add(Activation('softmax'))

sgd = SGD(lr=0.05) #lr指的是学习率,也就是梯度下降里的α,学习率越大意味着很可能拟合不到最优点,所以lr不能取太大

mdl.compile(loss="mean_squared_error",optimizer="adam") # 编译过程(建立模型的过程),loss指的是最优化函数(损失函数)\

# 每个输出对应的输出值和要拟合的标注值,进行平方求和再开方得到的值,让它最小,就是loss的含义; \

# optimizer 表示用什么样的优化器去优化

mdl.fit(X_train,np.array([[0,1] if i == 1 else [1,0] for i in Y_train]),nb_epoch=20000,batch_size=8999)

# nb_epoch 表示迭代的次数,合理取值; batch_size 随机梯度算法每次选取的数量,由于本样本数据量不是很大,所以取全部训练集

# 结果不理想,可以调整迭代次数nb_epoch 或 增加样本数量batch_size;也可以调整学习率lr,比如从0.01调整到0.05;\

# 也可以通过更改优化器optimizer比如将sgd改为adam

xy_lst = [(X_train,Y_train),(X_validation,Y_validation),(X_test,Y_test)]

for i in range(len(xy_lst)):

    X_part = xy_lst[i][0]

    Y_part = xy_lst[i][1]

    Y_pred = mdl.predict_classes(X_part) #输出分类标注

    print(i)

    print("NN",'--ACC',accuracy_score(Y_part,Y_pred))

    print("NN",'--REC',recall_score(Y_part,Y_pred))

    print("NN",'--F_score',f1_score(Y_part,Y_pred))

return

6.GBDT,回归树和提升树: GradientBoostingClassifier()

from sklearn.ensemble import GradientBoostingClassifier
models.append(('GBDT',GradientBoostingClassifier(max_depth=6,n_estimators=100))) # max_depth 只是一个经验值
# 参数learn_rate 第二个分类器已经进行了衰减进行10%的衰减;criterion:mse
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容