ホームページ >バックエンド開発 >Python チュートリアル >Pythonによるビッグデータ処理を詳しく解説

Pythonによるビッグデータ処理を詳しく解説

零下一度
零下一度オリジナル
2017-06-27 10:37:394960ブラウズ

共有

知識ポイント:
パッケージの逆アセンブリ時間を潤滑する | POSIXlt
デシジョンツリー分類を使用し、ランダムフォレスト予測を使用する
フィットに対数を使用し、exp関数を削減する

トレーニングセットはKaggle Washington Bike Sharingから取得シェア自転車と天候、時間等の関係を分析するための計画的なレンタサイクルデータ。データ セットには、合計 11 個の変数と 10,000 行を超えるデータが含まれています。

まず、公式データを見てみましょう。両方のテーブルに 2011 年から 2012 年のデータが含まれていますが、テスト ファイルには各月の日付がすべて含まれていますが、登録されたユーザーは存在しません。そしてカジュアルユーザー。 Train ファイルには 1 か月あたり 1 ~ 20 日しかありませんが、ユーザーには 2 つのタイプがあります。
解決策: Train ファイルに 21 ~ 30 の番号が付いたユーザーの数を入力します。評価基準は、予測と実際の数量の比較です。


1.png

最初にファイルとパッケージをロードします

library(lubridate)library(randomForest)library(readr)setwd("E:")
data<-read_csv("train.csv")head(data)

ここで落とし穴に遭遇しました。R言語のデフォルトのread.csvを使用して正しいファイル形式を読み取ることができませんでした。これはさらに悪いことです。これを xlsx に変更すると、すべての時間が 43045 のような奇妙な数値になります。以前にas.Dateを試したところ正しく変換できましたが、今回は分と秒があるためタイムスタンプしか使えませんが、結果は良くありません。
最後に、「readr」パッケージをダウンロードし、read_csv ステートメントを使用してスムーズに解釈しました。
テストの日付は列車の日付よりも完全ですが、ユーザーの数が欠落しているため、列車とテストをマージする必要があります。

test$registered=0test$casual=0test$count=0
data<-rbind(train,test)

時刻の抽出: ここでの時刻は比較的単純で時間数であるため、文字列を直接取得することもできます。

data$hour1<-substr(data$datetime,12,13)
table(data$hour1)

1 時間あたりの合計使用量をカウントすると、次のようになります (なぜこんなにすっきりしているのでしょう):


6-hour1.png

次のステップは、箱ひげ図を使用してユーザーとユーザーを確認することです。時間、週 これらの関係のいくつか。ヒスト ヒストグラムの代わりに箱ひげ図を使用する理由は何ですか? 箱ひげ図は離散点表現であるため、以下の適合を求めるために対数が使用されます。図からわかるように、時間の観点からは、登録ユーザーと非登録ユーザーの使用時間が非常に長くなります。違う。


5-hour-tregestered.png

5-hour-casual.png

4-boxplot-day.png
次に、相関係数Corを使用してテストしますユーザー、温度、体感温度、湿度、風速の関係。

相関係数: 変数間の線形関連性の尺度であり、異なるデータ間の相関の程度をテストします。

値の範囲は [-1, 1] で、0 に近づくほど関連性が低くなります。

計算結果から、ユーザー数は気温よりも影響が大きい風速と負の相関があることがわかります。


cor.png
次のステップは、決定木を使用して時間などの要因を分類し、ランダム フォレストを使用して予測することです。ランダム フォレストとデシジョン ツリーのアルゴリズム。非常に高度なことのように聞こえますが、実際には現在非常に一般的に使用されているため、必ず習得する必要があります。

デシジョン ツリー モデルは、シンプルで使いやすいノンパラメトリック分類子です。データについて先験的な仮定を必要とせず、計算は高速で、結果の解釈が容易で、堅牢でノイズの多いデータやデータの欠落を恐れません。

決定木モデルの基本的な計算手順は次のとおりです。まず、n 個の独立変数の 1 つを選択し、最適な分割点を見つけて、データを 2 つのグループに分割します。グループ化されたデータについては、特定の条件が満たされるまで上記の手順を繰り返します。
ディシジョン ツリー モデリングでは、解決する必要がある 3 つの重要な問題があります:
独立変数の選択方法
分割点の選択方法
分割を停止する条件を決定する

登録ユーザーと時間のディシジョン ツリーを作成する

train$hour1<-as.integer(train$hour1)d<-rpart(registered~hour1,data=train)rpart.plot(d)


3-raprt-hour1.png

あとは決定木の結果に応じて手動で分類しているので、やはりコードだらけです…

train$hour1<-as.integer(train$hour1)data$dp_reg=0data$dp_reg[data$hour1<7.5]=1data$dp_reg[data$hour1>=22]=2data$dp_reg[data$hour1>=9.5 & data$hour1<18]=3data$dp_reg[data$hour1>=7.5 & data$hour1<18]=4data$dp_reg[data$hour1>=8.5 & data$hour1<18]=5data$dp_reg[data$hour1>=20 & data$hour1<20]=6data$dp_reg[data$hour1>=18 & data$hour1<20]=7

同様に、make (時間 | 温度) X (登録 | ランダム ユーザー) デシジョン ツリーを待って手動分類を続行します....


3-raprt-temp.png

年份月份,周末假日等手动分类

data$year_part=0data$month<-month(data$datatime)data$year_part[data$year==&#39;2011&#39;]=1data$year_part[data$year==&#39;2011&#39; & data$month>3]=2data$year_part[data$year==&#39;2011&#39; & data$month>6]=3data$year_part[data$year==&#39;2011&#39; & data$month>9]=4
data$day_type=""data$day_type[data$holiday==0 & data$workingday==0]="weekend"data$day_type[data$holiday==1]="holiday"data$day_type[data$holiday==0 & data$workingday==1]="working day"data$weekend=0data$weekend[data$day=="Sunday"|data$day=="Saturday"]=1

接下来用随机森林语句预测

在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。
随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,再在其中选取最优的特征。这样决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。

ntree指定随机森林所包含的决策树数目,默认为500,通常在性能允许的情况下越大越好;
mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值—摘自datacruiser笔记。这里我主要学习,所以虽然有10000多数据集,但也只定了500。就这500我的小电脑也跑了半天。

train<-dataset.seed(1234)
train$logreg<-log(train$registered+1)test$logcas<-log(train$casual+1)

fit1<-randomForest(logreg~hour1+workingday+day+holiday+day_type+temp_reg+humidity+atemp+windspeed+season+weather+dp_reg+weekend+year+year_part,train,importance=TRUE,ntree=250)

pred1<-predict(fit1,train)
train$logreg<-pred1

这里不知道怎么回事,我的day和day_part加进去就报错,只有删掉这两个变量计算,还要研究修补。
然后用exp函数还原

train$registered<-exp(train$logreg)-1
train$casual<-exp(train$logcas)-1
train$count<-test$casual+train$registered

最后把20日后的日期截出来,写入新的csv文件上传。

train2<-train[as.integer(day(data$datetime))>=20,]submit_final<-data.frame(datetime=test$datetime,count=test$count)write.csv(submit_final,"submit_final.csv",row.names=F)

大功告成!
github代码加群

原来的示例是炼数成金网站的kaggle课程第二节,基本按照视频的思路。因为课程没有源代码,所以要自己修补运行完整。历时两三天总算把这个功课做完了。下面要修正的有:

好好理解三个知识点(lubridate包/POSIXlt,log线性,决策树和随机森林);
用WOE和IV代替cor函数分析相关关系;
用其他图形展现的手段分析
随机树变量重新测试

学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
626062078,我们一起学Python!

完成了一个“浩大完整”的数据分析,还是很有成就感的!

以上がPythonによるビッグデータ処理を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。