Overview

在数据挖掘(机器学习)领域,python之所以被广泛应用,与其强大的工具包关系密切。正好最近的项目里频繁地使用python处理数据,于是记录一下pythonscipy numpy scikits-learn等几个常用工具包的安装及其常用函数的使用。这里只记录在ubuntu 14.04下的安装使用,Mac系统的参考Chris的另一篇文章:Mac上安装Python机器学习库scikit-learnWindows版本的就不做介绍了。

1.安装工具包

相比于mac,在linux系统上安装这几个工具包十分快捷方便,分别只需一条命令即可成功。

  • 安装python-scipy
    sudo apt-get install python-scipy
    
  • 安装python-numpy
    sudo apt-get install python-numpy
    
  • 安装python-sklearn
    sudo apt-get install python-sklearn
    
  • 安装python_dev
    sudo apt-get install python-dev
    
  • 安装python-matplotlib
    sudo apt-get install python-matplotlib
    
  • 安装python-pandas
    sudo apt-get install python-pandas
    

其中需要注意的是,最好先安装python-scipypython-numpypython_dev这三个包,因为其他包的安装依赖这几个包。

2.工具包简单使用

我们以对训练集归一化的代码为例,简单认识一下这几个常用包中的常用函数。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#Copyright Chris & Young

def usage():
    print "normalize_train.py usage:"
    print "python normalize_train.py <options> <source files> "
    print "-i,--input: input a training dataset feature file."
    print "-o,--ouput: output a normalized training dataset feature file."
    print "-H,--header: input 'T' if the input_file contains header row, else input 'F'."
    print "-c,--class: input 'T' if the input_file contains class label column, else input 'F'."
    print "-h,--help: show the help information."

import re
import pandas as pd
import numpy as np
import fileinput
import sys, getopt
from os import listdir
from os.path import isfile, join
from sklearn import preprocessing

opts, args = getopt.getopt(sys.argv[1:], 'i:o:H:c:h',['input=','output=','header=','class=','help'])
input_file=""
output_file=""
header_input=""
class_input=""
#col_start这个变量,是归一化开始列的index。根据是否有class列而变化。
col_start=0
for opt, arg in opts:
    if opt in ('-i','--input'):
        input_file = arg
        elif opt in ('-o','--output'):
            output_file = arg
        elif opt in('-H','--header'):
            header_input = arg
            if header_input == "T":
                header_input='infer'
            elif header_input == "F":
                header_input=None
    elif opt in ('-c','--class'):
        class_input = arg
        if class_input=="T":
            col_start+=1
    elif opt in ('-h', '--help'):
        usage()
            sys.exit(2)
        else:
            usage()
            sys.exit(2)
#读取数据到dataframe中
df = pd.read_csv(input_file,header=header_input)
#print df
#df_columns存储读取进来的数据的header,即列头。
df_columns=df.columns
#再进行一次判断,如果没有header,列头为None,矩阵转换回数据框的时候需要用到列头。
if header_input==None:
    df_columns=None
#print df_columns
#将数据框分成两部分:class列单独拿出来,其余部分归一化处理
dataframe1 = df.ix[:,range(col_start)]
dataframe2 = df.ix[:,col_start:]
#print dataframe1,dataframe2
#matrix1存储第一个数据框的矩阵形式
matrix1 = np.array(dataframe1)
#print matrix1
#第二个数据框需要转化为float类型
dataframe2 = np.float64(dataframe2)
#下面两行代码是核心归一化代码
data_scaled = preprocessing.MinMaxScaler().fit(dataframe2)
matrix2 = data_scaled.transform(dataframe2)
#将两个矩阵水平连起来
matrix_final=np.hstack((matrix1,matrix2))
#print matrix_final
#矩阵加上列头重新变为数据框
df_final=pd.DataFrame(matrix_final,columns=df_columns)
#print df_final
if header_input==None:
    head=False
else:
    head=df_columns
#将数据框存储为csv格式的文件    
df_final.to_csv(output_file,header=head,index=False)

可以看到,常用的函数有如下几个:

(1). numpy.array:把数据框变成矩阵

 matrix1 = np.array(dataframe1)   

(2). numpy.float64:把数据变成float64类型

 dataframe2 = np.float64(dataframe2) 

(3). numpy.hstack:把两个行数相同的矩阵水平连接起来

 matrix_final=np.hstack((matrix1,matrix2))

把列数相同的矩阵垂直拼接是另一个函数:numpy.vstack

(4). pandas.DataFrame:把矩阵变成数据框

 df_final=pd.DataFrame(matrix_final,columns=df_columns)

(5). preprocessing.MinMaxScaler().fittransform

 data_scaled = preprocessing.MinMaxScaler().fit(dataframe2)
 matrix2 = data_scaled.transform(dataframe2)

preprocessing.MinMaxScaler().fit这个函数先得到数据的每一列的极值,然后存储起来供下一步transform进行归一化。

这几个函数只是在我们数据处理过程中经常用到的,其他更丰富的函数请参考官方文档。