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

时间:2022-10-31 15:45:49

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. chm文件索引丢失和不能搜索

    regsvr32 hhctrl.ocx regsvr32 itss.dll regsvr32 itircl.dll

  2. MVC4做网站后台:用户管理 ——用户组

    用户管理这块包含用户和用户组两部分. 用户组包括浏览 用户组列表,添加.修改.删除用户组等.按照前面思路系统是依据用户组来判断用户权限的,用户组的最主要目的是划分权限.权限这块以后单独在做. 下面实现 ...

  3. android图片的scaleType属性

    scaleType 保持图片原有大小 scaleType="fitXY"填满盒子 scaleType="fitStart"保持纵横比缩放放在左上角 scaleT ...

  4. jmeter(一)基础介绍

    参考书籍:段念<软件性能测试与案例剖析>——第二版 推荐一本书<零成本实现web性能测试——基于Apache—jmeter>,主要内容是一些关于jmeter的实战使用,想学习的 ...

  5. 关于开发环境 git 重新部署

    apps  开发机器 多次因为升级出现无法登陆 下面就重新部署 流程做笔记 1   备份 根目录下的 那一堆shell 和 Cache/data 下的系统配置 2  shell : su www   ...

  6. ubuntu下使用codeblocks

    集成开发环境搭建 1. 安装build-essential 方法: sudo apt-get install build-essential 作用:提供编译程序必须软件包的列表信息,编译程序有了这个软 ...

  7. Jndi使用好处,与简单实例【JBOSS】

    JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有 ...

  8. TFBOY 养成记 一些比较好多文章。

    API解释中文版(简书文章,没事看看): http://www.jianshu.com/p/e3a79eac554f Tensorlfow op辨异:tf.add()与tf.nn.bias_add() ...

  9. 【spring】-- 手写一个最简单的IOC框架

    1.什么是springIOC IOC就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. 如果我们手写一个最最简单的IOC,最终效果是怎样呢? xml配置: <b ...

  10. Linux平台上轻松安装与配置Domino

    Linux平台上轻松安装与配置Domino Domino Server的编译安装过程中需要用到libstdc++-2.9和glibc-2.1.1(或者其更高的版本)两个编译模块,它们是Linux开发编 ...