sklearn简单实现机器学习算法记录

需要引入最重要的库:Scikit-learn

一、KNN算法

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier iris = datasets.load_iris()
iris_x = iris.data
iris_y = iris.target x_train, x_test, y_train, y_test = train_test_split(iris_x, iris_y, test_size=0.3) knn = KNeighborsClassifier()
knn.fit(x_train, y_train) print(knn.predict(x_test))
print(y_test)

二、朴素贝叶斯

from sklearn.naive_bayes import BernoulliNB

def loadDataSet():
'''
postingList: 进行词条切分后的文档集合
classVec:类别标签
使用伯努利模型的贝叶斯分类器只考虑单词出现与否(0,1)
'''
postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
classVec = [0, 1, 0, 1, 0, 1] # 1代表侮辱性文字,0代表正常言论
return postingList, classVec def create_wordVec(dataset):
word_set = set([])
for doc in dataset:
word_set = word_set | set(doc) # 通过对两个集合取并,找出所有非重复的单词
return list(word_set) def words2Vec(wordList, input_set):
'''
@wordList:为前一个函数的输出值(包含单词)
@input_set:输入需要分类的集合
函数输出:包含0,1的布尔型向量(对应Wordlist中的单词出现与否)
'''
return_vec = [0] * len(wordList)
# 创建与词汇表等长的列表向量
for word in input_set:
if word in wordList:
return_vec[wordList.index(word)] = 1 # 出现的单词赋1
else:
print("the word %s is not in list" % word)
return return_vec if __name__ == '__main__':
p, c = loadDataSet()
vocab = create_wordVec(p)
vec = []
for pl in p:
vec.append(words2Vec(vocab, pl)) clf = BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None) # 伯努利模型
clf.fit(vec, c)
print("预测值:")
print(clf.predict(vec))
print("正确值:")
print(c)

三、Logistic回归

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split breast_cancer = load_breast_cancer()
# print(diabetes) diabetes_x = breast_cancer.data
diabetes_y = breast_cancer.target
# print(diabetes_x)
# print(diabetes_y) x_train, x_test, y_train, y_test = train_test_split(diabetes_x, diabetes_y, test_size=0.3) log = LogisticRegression(solver='liblinear')
log.fit(x_train, y_train) print(log.predict(x_test))
print(y_test)
# count = 0
# l = len(y_test)
# print(l)
# for i in range(l):
# if log.predict(x_test)[i] != y_test[i]:
# count += 1
# print(count)
#
# print(1 - count / l) # 输出准确率

四、支持向量机SVM

1. 线性 SVM 分类器

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.svm import SVC X, y = make_blobs(n_samples=50, centers=2,
random_state=0, cluster_std=0.60) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='spring') model = SVC(kernel='linear')
model.fit(X, y) def plot_svc_decision_function(clf, ax=None, plot_support=True):
"""Plot the decision function for a 2D SVC"""
if ax is None:
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim() x = np.linspace(xlim[0], xlim[1], 30)
y = np.linspace(ylim[0], ylim[1], 30)
Y, X = np.meshgrid(y, x)
xy = np.vstack([X.ravel(), Y.ravel()]).T
P = model.decision_function(xy).reshape(X.shape) ax.contour(X, Y, P, colors='k',
levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--']) if plot_support:
ax.scatter(clf.support_vectors_[:, 0],
clf.support_vectors_[:, 1],
s=300, linewidth=1, facecolors='none') ax.set_xlim(xlim)
ax.set_ylim(ylim) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(model) #显示分界线 plt.show() print("分类值:")
print(model.predict(X)) print("正确值:")
print(y)

2. SVM 与 核函数

对于非线性可切分的数据集,要做分割,就要借助于核函数

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_circles
from sklearn.svm import SVC
from mpl_toolkits import mplot3d X, y = make_circles(100, factor=0.1, noise=0.1) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='spring') # r = np.exp(-(X ** 2).sum(1))
# 画出3D图像
#
# def plot_3D(elev=30, azim=30, X=X, Y=y):
# ax = plt.subplot(projection='3d')
# ax.scatter3D(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
# ax.view_init(elev=elev, azim=azim)
# ax.set_xlabel('x')
# ax.set_ylabel('y')
# ax.set_zlabel('z')
#
#
# plot_3D(elev=45, azim=45, X=X, Y=y)
# plt.show() model = SVC(kernel='rbf', C=1E6)
model.fit(X, y) def plot_svc_decision_function(clf, ax=None, plot_support=True):
"""Plot the decision function for a 2D SVC"""
if ax is None:
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim() x = np.linspace(xlim[0], xlim[1], 30)
y = np.linspace(ylim[0], ylim[1], 30)
Y, X = np.meshgrid(y, x)
xy = np.vstack([X.ravel(), Y.ravel()]).T
P = model.decision_function(xy).reshape(X.shape) ax.contour(X, Y, P, colors='k',
levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--']) if plot_support:
ax.scatter(clf.support_vectors_[:, 0],
clf.support_vectors_[:, 1],
s=300, linewidth=1, facecolors='none') ax.set_xlim(xlim)
ax.set_ylim(ylim) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(model) plt.show() print("分类值:")
print(model.predict(X)) print("正确值:")
print(y)

3. 总结

  1. 非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
  2. 对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
  3. 支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量。因此,模型需要存储空间小,算法鲁棒性强;
  4. 无任何前提假设,不涉及概率测度;
  5. SVM算法对大规模训练样本难以实施;
  6. 用SVM解决多分类问题存在困难,经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器;
  7. SVM是O(n^3)的时间复杂度。在sklearn里,LinearSVC是可扩展的(也就是对海量数据也可以支持得不错), 对特别大的数据集SVC就略微有点尴尬了。不过对于特别大的数据集,你倒是可以试试采样一些样本出来,然后用rbf核的SVC来做做分类。

sklearn简单实现机器学习算法记录的更多相关文章

  1. Python机器学习算法 — KNN分类

    KNN简介 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.KNN分类算法属于监督学习. 最简单最初级的分类器是将全部的训练 ...

  2. 机器学习算法-K-NN的学习 /ML 算法 (K-NEAREST NEIGHBORS ALGORITHM TUTORIAL)

    1为什么我们需要KNN 现在为止,我们都知道机器学习模型可以做出预测通过学习以往可以获得的数据. 因为KNN基于特征相似性,所以我们可以使用KNN分类器做分类. 2KNN是什么? KNN K-近邻,是 ...

  3. 【机器学习PAI实践十二】机器学习算法基于信用卡消费记录做信用评分

    背景 如果你是做互联网金融的,那么一定听说过评分卡.评分卡是信用风险评估领域常用的建模方法,评分卡并不简单对应于某一种机器学习算法,而是一种通用的建模框架,将原始数据通过分箱后进行特征工程变换,继而应 ...

  4. 编程作业1.1——sklearn机器学习算法系列之LinearRegression线性回归

    知识点 scikit-learn 对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析. 我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法. 我们将scik ...

  5. 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考 ...

  6. paper 17 : 机器学习算法思想简单梳理

    前言: 本文总结的常见机器学习算法(主要是一些常规分类器)大概流程和主要思想. 朴素贝叶斯: 有以下几个地方需要注意: 1. 如果给出的特征向量长度可能不同,这是需要归一化为通长度的向量(这里以文本分 ...

  7. 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...

  8. 简单易学的机器学习算法——EM算法

    简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...

  9. [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...

随机推荐

  1. C语言中“段错误”出现的场景

    1.第一种“段错误”出现的场景 1 /************************************************************************* > Fi ...

  2. Cell theory|Bulk RNA-seq|Cellar heterogeneity|Micromanipulation|Limiting dilution|LCM|FACS|MACS|Droplet|10X genomics|Human cell atlas|Spatially resolved transcriptomes|ST|Slide-seq|SeqFISH|MERFISH

    生物信息学 Cell theory:7个要点 All known living things are made up of one or more cells. All living cells ar ...

  3. tesseract系列(4) -- tesseract训练问题总结

    1. 每次训练模型删除目录下,上述重复的名字 2. 生成inttemp.pffmtable文件的时候,如果下述命令(1)不行的话,或者报错,使用命令(2) (1)mftraining -F font_ ...

  4. javacv获取视频第一帧

    第一种是用ffmpeg工具,不过还得安装客户端软件,于是放弃了,还有一种是javacv开源工具,所以选择第二种: 第一种:ffmpeg工具 需要安装ffmpeg软件,支持windows和linux,视 ...

  5. 二十、linux文件系统讲解

    1.分区和文件系统的关系: 为什么需要格式化呢?这是因为分区文件系统在没有格式化前,操作系统是无法识别系统分区的格式的,就没办法组织文件目录属性和权限等内容,把分区格式化成操作系统支持的某个文件系统后 ...

  6. 数据结构与算法——认识O(NlogN)的排序(1)

    归并排序 1) 整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2) 让其整体有序的过程里用了外排序方法 3) 利用master公式来求解时间复杂度 4) 归并排序的实质 时间复杂度0(N ...

  7. 华为鸿蒙系统pk安卓系统

    Harmony OS Vs Android Comparison It isn’t based on Linux kernel The key difference between HarmonyOS ...

  8. springboot shiro ehcache redis 简单使用

    引入相关pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  9. 阿里巴巴IconFont的使用方式

    一.解释一下为什么要使用IconFont? IconFont顾名思义就是把图标用字体的方式呈现. 其优点在于以下几个方面: 1.可以通过css的样式改变其颜色:(最霸气的理由) 2.相对于图片来说,具 ...

  10. form提供的两种数据传输方式 get和post method=”post“和method=”get”

    虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的. ...