simple_male 0.1.2
A machine learning algorithm implementation
License: MIT


<center>
<img src="./docs/imgs/logo2.png" width="100%" height="100%" />
</center>


Simple Machine Learning

一个简单的机器学习算法实现


![](https://img.shields.io/pypi/v/simple_male.svg) [![Build Status](https://travis-ci.org/Yangruipis/simple_ml.svg?branch=master)](https://travis-ci.org/Yangruipis/simple_ml) [![Coverage Status](https://coveralls.io/repos/github/Yangruipis/simple_ml/badge.svg?branch=master)](https://coveralls.io/github/Yangruipis/simple_ml?branch=master)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/00c639db60364d12b0102456552fe806)](https://www.codacy.com/app/Yangruipis/simpleML?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=Yangruipis/simpleML&amp;utm_campaign=Badge_Grade)

![](https://img.shields.io/npm/l/express.svg) [![Join the chat at https://gitter.im/simple_ml/Lobby](https://badges.gitter.im/simple_ml/Lobby.svg)](https://gitter.im/simple_ml/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

---


# 快速开始

## 安装

**环境和依赖库**
- python3.5及以上
- windows or Linux
- numpy      (数组)
- matplotlib (作图)
- scipy      (求解优化问题)
- requests   (用于在线数据集获取)
- cvxopt    (支持向量机中的二次规划问题)

`强烈推荐Anaconda环境`

**pip安装**

```bash
pip install simple_male
```
对，是`simple_ma(chine)le(arning)`，简单男人，因为`simple_ml`已经在pypi上被人注册了喵

**git安装**

```bash
git clone https://github.com/Yangruipis/simple_ml.git
cd ./simple_ml
python setup.py install
```

## 使用

```python
# 一个简单的例子，用CART树进行二分类
from simple_ml.tree import CART
import numpy as np

X = np.array([[1,1.1],
              [1,2.0],
              [0,3.0],
              [0,2.2]])
y = np.array([1,1,0,0])
cart = CART(min_samples_leaf=1)
cart.fit(X, y)
x_test = np.array([[1,2],[3,4]])
print(cart.predict(x_test))
```
```python
Out[1]: np.array([1,1])
```

- `./simple_ml/examples`文件夹中提供了大多数方法的使用范例
- 更详细的用法见帮助文档： [https://yangruipis.github.io/simple_ml/](https://yangruipis.github.io/simple_ml/)

# 它能做什么

## 最最最最主要的任务

如果你同时满足：
1. **机器学习入门阶段**
2. **python 进阶阶段**

那么恭喜你，这个项目可以给你提供如下帮助：

- **阅读源码**， 不像sklearn过于复杂难读的源码，这个轻量级的项目非常易读，并且我尽可能的增加了注释，提高代码的可读性
- **学习知识**，该项目梳理基本机器学习算法的种类和流程，工程实现上的大致步骤，中间出现的一些细节问题以及如何解决
- **实时交流**，我在 gitter 上建立了 [gitchat 聊天室](https://gitter.im/simple_ml/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)，欢迎大家就项目本身的具体问题，或者其他任何相关事项进行讨论，欢迎大家积极提 issues，我会第一时间回复


## 作为一个机器学习项目的任务

### 1. 数据和特征

#### 1.1 数据集获取

`simple_ml`提供了大量经典的机器学习数据集的获取接口`DataCollector`，数据集来自[UCI](http://archive.ics.uci.edu/ml/index.php)。

#### 1.2 数据预处理

`simple_ml` 提供了常用的数据预处理方法，包括了编码、独热编码、缺失值处理、异常值处理以及随机数据集划分等。

同时，`simple_ml` 提供了`PCA`降维方法以及针对高维数据的`SuperPCA`降维方法。

#### 1.3 特征选择
`simple_ml`提供了Filter和Embedded两种特征选择方法，包括了：
1. 方差法
2. 相关系数法
3. 卡方检验法
4. L1正则
5. GBDT特征选择

### 2. 模型

#### 2.1 二分类
`simple_ml`提供了非常多的二分类方法，以[wine数据集](http://archive.ics.uci.edu/ml/datasets/Wine)为例（见`./simple_ml/examples`），分类效果和方法名称见图1。

<center>
<img src="./docs/imgs/wine.jpg"  />

图 1. 二分类效果图
</center>

#### 2.2 多分类

`simple_ml`暂时只提供了一些多分类算法，见下图，同样是[wine数据集](http://archive.ics.uci.edu/ml/datasets/Wine)，后面作者将会进行补充。

<center>
<img src="./docs/imgs/wine2.jpg" />

图 2. 多分类效果图
</center>


#### 2.3 回归

`simple_ml`提供了回归方法如下
- `MultiRegression`
- `CART`
- `GBDT`
- `SVR`

#### 2.4 聚类

`simple_ml`提供了`K-means聚类`和`层次聚类`两种聚类方法

`注:`以上所有图均为simple_ml直出（需要matplotlib）

### 3. 效果评价

包括了分类和回归作图、以及针对二分类、多分类、回归问题的评价指标计算，包括Precision, Recall等等

# 为什么会有这个项目 & 致谢

作者就读于上海某商科院校经济学，从大二开始接触数据挖掘，以及编程相关知识（stata->R->C#->python)，对数据和编程非常感兴趣，基本上一路走过来全靠自学。作者希望可以用心做好一个项目，记录自己学习的轨迹，尤其是即将毕业之际。

在接下来的一年找工作的同时，作者将尽全力维护该项目，不断更新和修改，热烈欢迎任何贡献和讨论。

**致谢：**
- 首先感谢我自己，一路走来的不易如人饮水
- 其次感谢我的好友[何燕杰](https://github.com/YanjieHe)和[程刚](https://github.com/chenggang0815)对我在学习和工作上的帮助
- 最后感谢所有相关书籍、博客的作者，尤其感谢[刘建平Pinard](https://www.cnblogs.com/pinard/)一丝不苟的机器学习博客，无论是知识还是态度，都令人肃然起敬


# 更新日志

- 2018-04-20
  - 加入BP神经网络算法`simple.neural_network`和相关的example
  - 更新github pages
- 2018-04-23
  - 加入`Stacking model`
  - 更新每个模型的new()函数
  - 重写`BaseModel`的`predict`和`score`抽象方法，以检查测试集是否满足要求
  - fix SuperPCA bugs
- 2018-04-24
  - 加入类：
    `Multi2binary`，继承该类的`BaseClassifier`可以将多分类问题转为二分类问题
  - 添加SVM， Logistic，NeuralNetwork, AdaBoost 的继承关系和多分类方法
  - 增加相关的多分类例子，以及帮助文档
  - 重写特征类型推断函数，根据多种线索进行推断
- 2018-04-26
  - 重写自动化模块`auto`，实现`BaseAuto`抽象类以及数据自动预处理的`AutoDataHandle`类
  - 加入网格搜索方法
  - 加入[宫颈癌数据](https://archive.ics.uci.edu/ml/datasets/Cervical+cancer+%28Risk+Factors%29)的完整处理Example
  - 加入`helper`模块，用于格式化输出
  - 加入`data_handle`模块的缺失值统计方法`nan_summary`
- 2018-04-27
  - 加入自动特征选择类 `AutoFeatureHandle` ，以及对应的宫颈癌Example
- 2018-06-11
  - 加入回归作图方法
- 2018-06-12
  - 加入多元回归方法`MultiRegression`并测试
  - `MultiRegression`中加入加权回归方法
- 2018-06-13
  - 重写支持向量机`SVM`，调用优化库进行求解，而不是手写SMO
  - 加入支持向量回归`SVR`
  - 整个支持向量相关算法,包括了`Kernel`类, `BaseSupportVector`类以及`SVM`,`SVR`
- 2018-06-20
  - 添加相关测试用例
- 2018-06-23
  - 添加`optimal`模块，包括了爬山法和模拟退火法进行最小值求解
  - pypi发布，版本 `0.1.2`

# TODO list:

- [ ] test cases
- [x] an efficient bp network
- [ ] more optimal methods
- [x] train test split func in helper
- [x] other feature select method to add
- [x] lasso and Ridge
- [x] add GBDT feature select
- [x] update Readme
- [x] setup.py
- [x] examples
- [x] get more datasets
- [x] regression plot
- [x] more regression method
- [ ] kd_tree
- [x] Support Machine Regression
- [x] more metrics
- [x] github pages, especially the class map
- [x] stacking
- [x] 二分类转多分类器
- [x] recognize nan and inf
- [x] check x before predict, check x and y before score
- [x] "self.new()" function in each model
- [x] 支持向量相关算法测试和文档撰写
- [ ] pypi发布
- [ ] 移除logistic.py 中对scipy的依赖,自己写fmin(),以及实现底层优化算法
- [ ] LSTM

# TODO List AUTO MODEL

- [x] auto data handle
- [x] auto feature select
- [ ] auto param select
- [ ] auto model select