Python Machine Learning

2019-01-28  本文已影响0人  SnC_

//机器学习笔记

机器学习主要分为4大类:

  1. Classification : 如区分猫狗,趋向于分类
  2. Regression : 如预测股票价格,趋向于数字量化
  3. Cluster Analysis : 将相似数据放到一起
  4. Association Analysis : 尝试发现不同事物间的联系

Classification 和 Regression 是带有明确目的的研究。属于supervised
Cluster Analysis 和Association Analysis 属于无明确目的的探索性研究。属于unsupervised

术语terms

Classification

主要有3种研究方法:

training phase : training data + model . 主要目的是调整model中的参数,以达到相对小的错误率。
testing phase : testing data + trained model . 主要目的是检测model的工作性能。

#用天气监测数据,结合机器学习中的decision tree建立一个能根据早上9点的数据预测下午3点是否下雨的model.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy.score

data = pd.read_csv('daily_weather.csv') #读取数据

#data cleaning
del data['number'] #删除不需要的列
data = data.dropna() #删除空值

#准备数据
clean_data = data.copy()
clean_data['high_humidity_lable'] = (clean_data['relative_humidity_3pm']>24.99)*1
#以湿度大于24.99作为下雨的标准,以此作为机器学习的lable,即下面的y
y = clean_data[['high_humidity_lable']].copy() #注意这里的双层中括号. 单层会导致y为Series而非DataFrame
morning_features = ['air_pressure_9am','air_temp_9am','avg_wind_direction_9am','avg_wind_speed_9am',
        'max_wind_direction_9am','max_wind_speed_9am','rain_accumulation_9am',
        'rain_duration_9am'] #取出所有与早9点的天气数据有关的列
x = clean_data[morning_features].copy() #x作为original data set

#training phase
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=324) 
#0.33表示保留33%的数据,留着作为testing data。其他数据作为training data
#324作为random number generator的seed。该参数可变,不同参数会导致最后不同的预测准确度。
humidity_classifier = DecisionTreeClassifier(max_leaf_nodes=10, random_state=0)
#max_leaf_nodes设为10作为决策树划分结果的严格程度。过高或过低都不太好。 不设值将默认设为无穷。
#random_state作用同上。
humidity_classifier.fit(x_train, y_train) #通过training 得到model

#testing phase
predictions = humidity_classifier.predict(x_test)

#验证结果准确率
accuracy_score(y_ture = y_test, y_pred = predictions)

Cluster Analysis

将互相相似的sample划分到同一个group/cluster中。

几种距离计算方式:

cluster analysis 属于unsupervised,这样的分析没有准确的目标,没有最正确的结果,没有lable。

K-means

centroid : center of a cluster
WSSE : (within-cluster sum of squared error)。 error即cluster中的sample与centroid的距离,squared error 即距离平方。所有点的squared error之和即WSSE。

K-Means建立model的大概步骤:

  1. 给出k个原始centroid
  2. 将sample分配给与它最接近的centroid (涉及到计算距离)
  3. 调整centroid位置,随之调整sample分配情况
  4. repeat,直到达到自设标准

最终的cluster分类结果与原始的k的设置有较大关系。如何确定K的数量应设为几?
以下有几种k的数量确定方式:

  1. Visualization : 将数据集画一张图,观察数据是否有天然的能观察到的聚集情况。
  2. Application-dependent : 此方式更多地依赖于分析师自身对于研究课题的熟悉程度。比如研究客户喜欢购买什么样的商品时,对于选取哪些商品类别应有自己的打算。 研究地理情况的人员,对于自己想要研究的地点应心中有数。
  3. Elbow Method : 画出k的数量(横轴)与WSSE(纵轴) 的折线图,选取下落最明显的位置(肘部),作为K的数量。

如何确定何时该停止?

  1. 当改变centroid位置不再导致cluster的内容变化时。
  2. 当改变centroid位置时,更换cluster的sample数目低于某个阀值。
# csv file download link : https://drive.google.com/open?id=0B8iiZ7pSaSFZb3ItQ1l4LWRMTjg
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScalar
from sklearn.cluster import KMeans
from itertools import cycle, islice
from pandas.plotting import parallel_coordinates

#拿到数据,先熟悉内容,删去无效数据。这是后续分析的基础。
data = pd.read_csv('minute_weather.csv')
sample = data[(data['rowID']%10) == 0] #由于数据较大,每10个采样一次。
sample.describe().transpose() #describe()方式是直观感受数据的好途径。
del sample['rain_accumulation']
del sample['rain_duration'] #通过观察发现这两列大部分值为0,将其删去

#准备分析的内容
features = ['air_pressure', 'air_temp', 'avg_wind_direction', 'avg_wind_speed', 
'max_wind_direction',  'max_wind_speed','relative_humidity']
select = sample[features]

#开始建立model,并分析
X = StandardScaler.fit_transform(select) #对特征进行标准化/特征缩放
kmeans = KMeans(n_clusters=12)
model = kmeans.fit(X) #分析生成center
centers = model.cluster_centers_ #12个cluster共12组,每组7个feature对应7个center

#显示结果
def pd_centers(featureUsed, centers): #add a column "number" for each cluster
    colNames = list(featuresUsed)
    colNames.append('prediction')
    Z = np.append[(A,index) for index, A in enumerate(centers)]
    P = pd.DataFrame(Z, columns = colNames)
    P['prediction'] = P['prediction'].astype('int')
    return P

def parallel_plot(data): #create parallel plots 
    my_color = list(islice(cycle(['b','r','g','y','k']), None, len(data)))
    plt.figure(figsize=(15, 8)).gca().axes.set_ylim([-3,+3])
    parallel_coordinates(data, 'prediction', color=my_colors, marker='o')

P = pd_centers(features, centers)
#下面绘图的参数按照自己想研究的内容来即可
parallel_plot( P[P['relative_humidity']<-0.5] ) #干燥天气
parallel_plot( P[P['air_temp']>0.5] ) #较暖天气

Regression

Linear Regression -- Least Square Method (LSM)

LSM的目标:画一张坐标图,根据样本点,找到一条regression line,使其后续的预测值与真实值的square error之和最小。 (此处error为同一横坐标下的垂直距离)

Linear Regression的目标:致力于寻找输入与输出之间的线性关系,用LSM方法找到最适合样本集的regression line。

# 根据球员各方面的属性指标,预测其价值得分
# file link : https://www.kaggle.com/hugomathien/soccer
import sqlite3
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from math import sqrt
from sklearn.metrics import mean_squared_error

#读取数据
db = sqlite3.connect('database.sqlite')
df = pd.read_sql_query("select * from Player_Attributes", db)

#熟悉数据,选择要分析的部分,清洗数据
df.columns
features = [
       'potential', 'crossing', 'finishing', 'heading_accuracy',
       'short_passing', 'volleys', 'dribbling', 'curve', 'free_kick_accuracy',
       'long_passing', 'ball_control', 'acceleration', 'sprint_speed',
       'agility', 'reactions', 'balance', 'shot_power', 'jumping', 'stamina',
       'strength', 'long_shots', 'aggression', 'interceptions', 'positioning',
       'vision', 'penalties', 'marking', 'standing_tackle', 'sliding_tackle',
       'gk_diving', 'gk_handling', 'gk_kicking', 'gk_positioning',
       'gk_reflexes'] #作为输入的特征
target = ['overall_rating'] #作为输出的特征
df = df.dropna()

# 开始建立training data set,testing data set (同Classification)
X = df[features]
Y = df[target]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.33, random_state = 324) 
#参数的意义同Classification

#建立linear regression model -- training phase
regressor = LinearRegression()
regressor.fit(X_train, Y_train)

#建立linear regression model -- testing phase
Y_prediction = regressor.predict(X_test)

#验证结果准确率
RMSE = sqrt(mean_squared_error(y_true = Y_test, y_pred = Y_prediction))

上一篇下一篇

猜你喜欢

热点阅读