python数据分析与挖掘实战第九章总结

本博客旨在帮助学生自己巩固所学,若能帮得上他人也是荣幸之至
首先以下是借鉴过的几个github库,非常感谢:
https://github.com/apachecn/python_data_analysis_and_mining_action
https://github.com/keefecn/python_practice_of_data_analysis_and_mining
https://github.com/Stormzudi/Python-Data-Mining
https://github.com/Echo9573/DataAnalysisbyPython

主要参考https://blog.csdn.net/u012063773/article/details/79302599

1 获取当前工作目录及子目录下所有图片文件的绝对路径,包含其所有子文件夹中的图片

from __future__ import division
from PIL import Image
import cv2
import numpy as np
import os
from pandas import DataFrame
import pandas as pd

# 获取当前工作目录及子目录下所有图片文件的绝对路径,包含其所有子文件夹中的图片
def getimgdir(imgfilename):
    imgdirs = []
    imgTypes = [".png", ".jpg", ".bmp"]
    if imgfilename:
        presentfiles = imgfilename
    else:
        presentfiles = os.getcwd()  # 获得当前工作目录

    for root, dirs, files in os.walk("."):
        r = root[2:]
        for afile in files:
            if r != '':
                ffile = presentfiles + "\\" + r + "\\" + afile
            else:
                ffile = presentfiles + "\\" + afile

            if ffile[ffile.rindex("."):].lower() in imgTypes:
                imgdirs.append(ffile)
    return imgdirs

2 获取当前工作目录及子目录下所有图片文件的绝对路径 # 不包含下层文件夹中的图片

def getimgdir_designed(imgfilename):
    if os.path.exists(imgfilename)== False:# 若指定的文件夹不存在,则提示!
        print('你设定的指定文件夹不存在!')
        return None
    imgdirs = []
    imgTypes = [".png", ".jpg", ".bmp"]
    presentfiles = imgfilename#获得当前工作目录
    recursion = 0  # 控制递归深度,只递归当前目录
    for root, dirs, files in os.walk(presentfiles):
        for afile in files:
            ffile = presentfiles + "\\" + afile
            if ffile[ffile.rindex("."):].lower() in imgTypes:
                imgdirs.append(ffile)
        if (not recursion):
            break
    return imgdirs

3 将图片切割成(2halfw)(2*halfh)像素的文件,并返回切割后的文件的绝对路径

'''将图片切割成(2*halfw)*(2*halfh)像素的文件,并返回切割后的文件的绝对路径
src是待切割的文件的绝对路径,halfw是切割后图片的宽度的一半, 
halfh是切割后图片的长度的一半,dstpath是切割后图片的保存路径
注意:在切割图片时,要先确保要处理的图片中央位置是有效图片,若不是,则需要进行图片处理'''
def splitimage(src, halfw, halfh, dstpath):
    img = Image.open(src)
    w, h = img.size

    s = os.path.split(src)
    if dstpath == '':
        dstpath = s[0]
    fn = s[1].split('.')
    basename = fn[0]
    ext = fn[-1]

    box = (h // 2 - halfh, w // 2 - halfw, h // 2 + halfh, w // 2 + halfw)
    pic_cut_name = os.path.join(dstpath, basename + '_cut' + '.' + ext)
    img.crop(box).save(pic_cut_name)
    return pic_cut_name

4 颜色矩方式进行特征提取

# 颜色矩方式进行特征提取
def color_moments(filename):

    img = cv2.imread(filename)
    if img is None:
        return
    # Convert BGR to HSV colorspace
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # Split the channels - h,s,v
    h, s, v = cv2.split(hsv)
    # 初始化颜色特征
    color_feature = []

    # 一阶中心矩求解 sum(x)/N = mean  ---均值
    h_mean = np.mean(h)  # np.sum(h)/float(N)
    s_mean = np.mean(s)  # np.sum(s)/float(N)
    v_mean = np.mean(v)  # np.sum(v)/float(N)
    color_feature.extend([h_mean, s_mean, v_mean])
    # 二阶中心矩求解 (sum(x-mean)/N)**(1/2) = std ---方差
    h_std = np.std(h)  # np.sqrt(np.mean(abs(h - h.mean())**2))
    s_std = np.std(s)  # np.sqrt(np.mean(abs(s - s.mean())**2))
    v_std = np.std(v)  # np.sqrt(np.mean(abs(v - v.mean())**2))
    color_feature.extend([h_std, s_std, v_std])
    # 三阶中心矩求解 ((sum(x-mean))**(1/3)/N)**(1/3)
    h_skewness = np.mean((h - h.mean())**3)
    s_skewness = np.mean((s - s.mean())**3)
    v_skewness = np.mean((v - v.mean())**3)
    h_thirdMoment = abs(h_skewness)**(1./3) * (-1 if h_skewness < 0 else 1)
    s_thirdMoment = abs(s_skewness)**(1./3) * (-1 if s_skewness < 0 else 1)
    v_thirdMoment = abs(v_skewness)**(1./3) * (-1 if v_skewness < 0 else 1)
    color_feature.extend([h_thirdMoment, s_thirdMoment, v_thirdMoment])

    return color_feature

5 纵向连接多个表格

ALLDATA = pd.concat([d1,d2,d3,d4,d5],ignore_index=True) # 做表格连接

6 随机打乱顺序

from random import shuffle # 引入随机函数
shuffle(data)
# 或者
inputfile = 'moment.csv'
data = pd.read_csv(inputfile, encoding='gbk')
# 注意,此处不能用shuffle
sampler = np.random.permutation(len(data))
d = data.take(sampler).values

支持向量机SVM进行分类,得混淆矩阵,准确率,混淆矩阵图


# coding: utf-8


# 9.2.2 模型构建
### 1 模型输入 # 80% 做训练集、20% 做测试集

# 数据抽样代码

import pandas as pd
from pandas import DataFrame,Series
import random 
import numpy as np


inputfile = 'moment.csv'
data = pd.read_csv(inputfile, encoding='gbk')
# 注意,此处不能用shuffle
sampler = np.random.permutation(len(data))
d = data.take(sampler).values

data_train = d[:int(0.8*len(data)),:] #选取前80%做训练集
data_test = d[int(0.8*len(data)):,:] #选取后20%做测试集


# 构建支持向量机模型代码
x_train = data_train[:, 2:]*30 #放大特征
y_train = data_train[:,0].astype(int)
x_test = data_test[:, 2:]*30 #放大特征
y_test = data_test[:,0].astype(int)

# 导入模型相关的支持向量机函数  建立并且训练模型
from sklearn import svm 
model = svm.SVC()
model.fit(x_train, y_train)
import pickle
pickle.dump(model, open('svcmodel.model','wb'))# model = pickle.load(open('svcmodel.model','rb'))

# 导入输出相关的库,生成混淆矩阵
from sklearn import metrics
cm_train = metrics.confusion_matrix(y_train, model.predict(x_train)) # 训练样本的混淆矩阵

cm_test = metrics.confusion_matrix(y_test, model.predict(x_test)) # 测试样本的混淆矩阵

df1 = DataFrame(cm_train, index = range(1,6), columns=range(1,6))
df2 = DataFrame(cm_test, index = range(1,6), columns=range(1,6))
df1.to_excel('trainPre.xlsx')
df2.to_excel('testPre.xlsx')
print(model.score(x_train,y_train)) # 评价模型训练的准确率
print(model.score(x_test,y_test)) # 评价模型测试的准确率


# import matplotlib.pyplot as plt #导入作图库
# get_ipython().magic(u'matplotlib inline')
# plt.matshow(cm_test, cmap=plt.cm.Greens) #画混淆矩阵图,配色风格使用cm.Greens,更多风格请参考官网。
# plt.colorbar() #颜色标签
#
# for x in range(len(cm_test)): #数据标签
#     for y in range(len(cm_test)):
#         plt.annotate(cm_test[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
#
# plt.ylabel('True label') #坐标轴标签
# plt.xlabel('Predicted label') #坐标轴标签
# plt.show()

#'''
#等价于下面这段
from cm_plot import *
cm_plot(y_train, model.predict(x_train)).show() # cm_plot是自定义的画混淆矩阵的函数
#'''
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值