您的位置:首页 > 编程语言 > Python开发

常见数据挖掘算法和Python简单实现

2017-04-21 11:15 573 查看
1、K近邻算法

原理:计算待分类样本与每个训练样本的距离,取距离最小的K个样本,这k个样本,哪个类别占大多数,则该样本属于这个类别。

优点:1、无需训练和估计参数,2、适合多分类,3、适合样本容量比较大的问题

缺点:1、对测试样本内存开销大,2、可解释性差,无法生成规则,3、对样本量小的问题,容易误分

经验:K一般低于样本量的平方根,基于交叉验证

问题:类别判断:投票法没有考虑距离的远近,可以采用加权投票‘’

          高维度变量:维度越高,欧氏距离的区分能力越差。

import numpy as np

from sklearn import neighbors

knn = neighbors.KNeighborsClassifier()

knn.fit(x,y)

knn.predict() 

2、决策树

原理:以树的结构递归的选择特征,并根据特征对样本进行分割,获得子树结构的过程。

优点:1、速度快,容易形成规则,2、准确度高,易于理解;3、可以处理连续和分类字段,4、不需要参数假设和任何领域知识,5、适合高维数据

缺点:1、对于各类别样本数量不一致数据,信息增益偏向于数值更多的特征,2、易于过拟合,3、忽略关性

ID3:使用信息增益作为特征选择的度量,1、当分类不均匀时,分类精度大打折扣;2、不能处理连续数据和带缺失值数据
import numpy as np
from sklearn import tree
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.cross_validation import train_test_split
data = np.array([[1.5 ,50,'thin'], [1.5 ,60, 'fat'] ,[1.6 ,40 ,'thin'], [1.6 ,60, 'fat'] ,[1.7 ,60 ,'thin'], [1.7 ,80 ,'fat'] ,[1.8 ,60 ,'thin'],[1.8 ,90 ,'fat'], [1.9 ,70 ,'thin'],[1.9 ,80, 'fat']])
labels = data[:,-1]
y = np.zeros(labels.shape)
y[labels=='fat']=1
y[labels=='thin']=0
x = data[:,:2]
x_train,x_test,y_train,y_test = train_test_split(x,y, test_size=0.2,random_state=0) 
clf=tree.DecisionTreeClassifier(criterion='entropy')
clf.fit(x_train, y_train)

with open("tree.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)

print (clf.feature_importances_)
precision, recall, thresholds = precision_recall_curve(y_train,clf.predict(x_train))
answer = clf.predict_proba(x)[:,1]
print(classification_report(y,answer,target_names = ['thin', 'fat']))

3、朴素贝叶斯

原理:对于待分类的项目,    求解此项出现的条件下各类别出现的概率,那个最大,此待分类项就属于哪个类别。

优点:分类速度快,对缺失值不敏感,准确度高

缺点:需要知道先验概率

from sklearn.naive_bayes import GaussianNB

model = GaussianNB()

model.fit(x, y )

model.predict()

4、Logistic回归

原理:面对一个回归或者分类函数,建立一个代价函数,通过迭代法求解出最优模型参数。

优点:速度快。适合二分类问题;直接看到各个特征的权重,能更容易更新模型吸收新的数据。

缺点:对数据和场景的适应能力不强。
过拟合问题往源自 过多的特征
解决方法 1)减少特征数量(减少特征会失去一些信息,即使特征选的很好)  可用人工选择要保留的特征;  模型选择算法; 
2)正则化(特征较多时比较有效)  保留所有特征,但减少θ的大小

5、支持向量机

原理:通过最大化分类分界点到分类界面距离来实现分类。

优点:提高泛化性能,解决小样本下机器学习的问题,避免神经昂神经网络选择和局部极小的问题。

缺点:对缺失数据敏感,内存消耗大,难解释。

SVM和逻辑回归区别:

从目标函数看,逻辑回归采用logistical loss ,SVM采用hinge loss。

逻辑回归是参数模型,SVM是非参数模型。

6、Adaboost

集成学习:1、boosting是同一种机器学习算法,数据抽取时,裙权值在不断更新,每次提高前一次分错了的数据集的权值,最后得到T个弱分类器,且分类器的权值跟中间结果的数据有关;

bagging:同一种弱分类器,数据抽取通过有放回抽样(bootstrap);

stacking算法:第一层行程T个弱分类器,生成相同的新数据及,利用这个数据集和新算法构成第二层分类器。

adaboost算法:是一种迭代算法,针对同一个训练集训练不同的分类器,然后把分类器集合起来,构成一个更强的分类器。关注被错分的样本,器重好的分类器

优点:不担心过拟合问题,不用做特征筛选,可以用各种方法构造分类器。

from sklearn.ensemble import GradientBoostingcClassifier

model=GradientBoostingClassifier(n_estimators=100,learning_rate=1.0,max_depth=1,random_state=0)

model.fit()

7、K-均值聚类

优点:当聚类是密集的,且类与类之间区别明显时,效果较好;对于处理大数据及,这个算法相对高校,计算复杂度为O(NKT),N是数据量,  K 是聚类中心, T是迭代的次数。

from sklearn.clster import KMeans

clf = KMeans(n_clusters=3,max_iter=300,n_init=10)

8、PCA

原理:通过线性投影,将高维空间映射到低维空间,所投影维度上数据的方差最大。

注意:使用pca可以提取主成分,肯能会解决一些过拟合问题,但不建议使用降维解决过拟合,建议加个正则化项来解决。

只有源数据结果较好,但嫌他太慢采用主成分分析。
from sklearn.decomposition import PCA
import numpy as np
import pandas as pd
data = np.random.randn(10,4)
pca = PCA()
pca.fit(data)
print (pca.components_)
print (pca.explained_variance_ratio_)

pca = PCA(3)
pca.fit(data)
lowd = pca.transform(data)
pd.DataFrame(lowd).to_excel("E:/contest_data/result.xlsx")
pca.inverse_transform(lowd)

10.apriori关联分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法