Python Machine Learning
//机器学习笔记
机器学习主要分为4大类:
- Classification : 如区分猫狗,趋向于分类
- Regression : 如预测股票价格,趋向于数字量化
- Cluster Analysis : 将相似数据放到一起
- Association Analysis : 尝试发现不同事物间的联系
Classification 和 Regression 是带有明确目的的研究。属于supervised
Cluster Analysis 和Association Analysis 属于无明确目的的探索性研究。属于unsupervised
术语terms
- sample, example, row, instance, record, observation 都表示数据集中的一个例子。
- variable, column, field, attribute, feature, dimension 都表示数据集中的一个属性。
Classification
主要有3种研究方法:
- KNN
- Naive Bayes
- Decision Tree : 从一总数据集开始,每一层加入判断条件,划分子集。最终得到最符合目标的子集。
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中。
几种距离计算方式:
- Euclidean Distance :即两点之间直线最短
- Manhattan Distance :垂直距离+水平距离
- Cosine Similarity : 不同点与基点所成cos角度的差距
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的大概步骤:
- 给出k个原始centroid
- 将sample分配给与它最接近的centroid (涉及到计算距离)
- 调整centroid位置,随之调整sample分配情况
- repeat,直到达到自设标准
最终的cluster分类结果与原始的k的设置有较大关系。如何确定K的数量应设为几?
以下有几种k的数量确定方式:
- Visualization : 将数据集画一张图,观察数据是否有天然的能观察到的聚集情况。
- Application-dependent : 此方式更多地依赖于分析师自身对于研究课题的熟悉程度。比如研究客户喜欢购买什么样的商品时,对于选取哪些商品类别应有自己的打算。 研究地理情况的人员,对于自己想要研究的地点应心中有数。
- Elbow Method : 画出k的数量(横轴)与WSSE(纵轴) 的折线图,选取下落最明显的位置(肘部),作为K的数量。
如何确定何时该停止?
- 当改变centroid位置不再导致cluster的内容变化时。
- 当改变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。
- RMSE(Root Mean Squared Error):该值越小,说明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))