diff --git a/Data/submission_gam.csv b/Data/submission_gam.csv new file mode 100644 index 0000000..969004d --- /dev/null +++ b/Data/submission_gam.csv @@ -0,0 +1,396 @@ +Id,Net_demand +1,40309.5625 +2,40596.9791666667 +3,35496.3333333333 +4,32913.1875 +5,38491.2083333333 +6,39991.2291666667 +7,40000.8541666667 +8,36224.75 +9,33317.8958333333 +10,32888.2083333333 +11,33371.3125 +12,38807.9791666667 +13,41194.3541666667 +14,40933.4583333333 +15,40659.5625 +16,37828.6875 +17,31297.7916666667 +18,30686.4583333333 +19,37698.5416666667 +20,39634.0833333333 +21,39512.4375 +22,40840.7708333333 +23,42086.625 +24,36698.625 +25,33634.9166666667 +26,35443.3541666667 +27,36628.8125 +28,40641.0625 +29,42883.4583333333 +30,40091.8541666667 +31,29867.5 +32,32048.875 +33,41346.4583333333 +34,41669.0416666667 +35,35995.75 +36,41202.75 +37,41076.1458333333 +38,36779.2916666667 +39,33008.3958333333 +40,39929.5833333333 +41,41526.2291666667 +42,43202.5833333333 +43,42081.6458333333 +44,39314.0208333333 +45,31867.7916666667 +46,32384.3125 +47,37325.7083333333 +48,39501.8333333333 +49,36310.1458333333 +50,37335.4166666667 +51,35495.3125 +52,33249.3125 +53,25689.4583333333 +54,31108.375 +55,38410.125 +56,36902.7916666667 +57,35749.3333333333 +58,35974.1458333333 +59,31453.375 +60,31908.75 +61,32418.2083333333 +62,25811.2291666667 +63,35885.375 +64,36437.2291666667 +65,39712.6875 +66,39262.9375 +67,33642 +68,36619.6041666667 +69,36398.1041666667 +70,41812.5416666667 +71,44955.0625 +72,39947.3541666667 +73,39516.2083333333 +74,39910.0416666667 +75,45408.4791666667 +76,42256.2708333333 +77,40008.7916666667 +78,38516.9166666667 +79,45221.6041666667 +80,45481 +81,40378.5416666667 +82,47154.9166666667 +83,45390.5625 +84,46389.5416666667 +85,46446.625 +86,49811.6666666667 +87,47523.7083333333 +88,43471.8958333333 +89,51836.875 +90,56769.7083333333 +91,57592.5833333333 +92,57416.7291666667 +93,59242.4791666667 +94,53426.7083333333 +95,55187.3958333333 +96,62918.6666666667 +97,63730.3125 +98,63373.1875 +99,65572.1458333333 +100,64320.4166666667 +101,61625.1458333333 +102,62985.6458333333 +103,70685.2083333333 +104,69177.6666666667 +105,67430.6666666667 +106,64044.7916666667 +107,65086.0625 +108,65602.0416666667 +109,58230.1875 +110,49501.4583333333 +111,47834.8333333333 +112,47425.3541666667 +113,41866.6458333333 +114,38276.6666666667 +115,39792.625 +116,36234.5 +117,39819.6041666667 +118,45928.4375 +119,38560.6666666667 +120,39960.5416666667 +121,37918.1666666667 +122,29087.9583333333 +123,31844.5833333333 +124,42440.7083333333 +125,47643.5625 +126,42026.5 +127,47397.3333333333 +128,47225.5208333333 +129,38291.3541666667 +130,38075.75 +131,44429.7916666667 +132,48979.7916666667 +133,45651.3958333333 +134,42880.8958333333 +135,44328.3125 +136,39689.6666666667 +137,38962.3333333333 +138,50746.625 +139,62447.1666666667 +140,64377.6458333333 +141,67070.9791666667 +142,66298.1041666667 +143,58245.5 +144,62490.25 +145,67615.1875 +146,67373.1875 +147,71625.4791666667 +148,68463.2708333333 +149,63235.8125 +150,61212.1666666667 +151,61480.9375 +152,63116.625 +153,60732.8125 +154,56162.3333333333 +155,56593.4791666667 +156,55219.8333333333 +157,52522.9583333333 +158,46091.1666666667 +159,55473.25 +160,58059.8541666667 +161,63633.4583333333 +162,67228.2916666667 +163,64153.375 +164,57244.0416666667 +165,52551.0833333333 +166,58590 +167,58156.2083333333 +168,55974.6041666667 +169,52037 +170,47319.25 +171,41617.1041666667 +172,42526.7916666667 +173,51303.125 +174,54184.0208333333 +175,53918.2916666667 +176,54757.6875 +177,51951.3958333333 +178,48022.0416666667 +179,41885.125 +180,53586.1666666667 +181,60097.4583333333 +182,58635.375 +183,61386.5625 +184,58519.6666666667 +185,53606.5 +186,52976.6041666667 +187,58802.5625 +188,54050.6666666667 +189,46577.8333333333 +190,39825.625 +191,42208.8333333333 +192,46992.0208333333 +193,35790.5416666667 +194,33368.9166666667 +195,38509.5833333333 +196,49210.0833333333 +197,43049.9583333333 +198,41882 +199,37674.625 +200,39486.9166666667 +201,46225.7291666667 +202,44126.2708333333 +203,37719.3125 +204,34921.4583333333 +205,33728.9166666667 +206,31419.9375 +207,32807.1458333333 +208,45676.1666666667 +209,46475.1041666667 +210,41484.1875 +211,34098.1041666667 +212,30854.8125 +213,31064.8125 +214,36078.6666666667 +215,43873.6458333333 +216,45632.6666666667 +217,49354.6458333333 +218,45558.2291666667 +219,44956.1666666667 +220,39456.0208333333 +221,36057.8125 +222,33241.375 +223,38388.2916666667 +224,36261.5833333333 +225,39928.9375 +226,43844.625 +227,37141.2708333333 +228,37039.75 +229,41854.3958333333 +230,39222.2916666667 +231,37890.0625 +232,38307.0625 +233,41926.8958333333 +234,35888.9791666667 +235,30495.5625 +236,38664.9583333333 +237,43763.75 +238,44180.5625 +239,41684.9166666667 +240,36665.4791666667 +241,36302.0833333333 +242,32645.9791666667 +243,31653.375 +244,36514.9375 +245,33619.125 +246,33427.9375 +247,36877.2708333333 +248,33381.7708333333 +249,32190.6875 +250,32654.8958333333 +251,36470.5833333333 +252,34920.5 +253,39152.4791666667 +254,38541.5208333333 +255,32278.3333333333 +256,31430.25 +257,35415.8958333333 +258,33463.625 +259,33851.8541666667 +260,30976.3958333333 +261,31574.625 +262,29349.7083333333 +263,30024.2708333333 +264,35590.5 +265,33563.1666666667 +266,33006.1458333333 +267,31380.0833333333 +268,31721.2291666667 +269,28989.1666666667 +270,27466.1666666667 +271,25624.9791666667 +272,29054.9583333333 +273,31420 +274,33059.3333333333 +275,31627.1458333333 +276,28827.3541666667 +277,27355.0208333333 +278,32402.3125 +279,34007.375 +280,34461.8333333333 +281,35336.5416666667 +282,36574.3958333333 +283,32460.0416666667 +284,31221.8541666667 +285,36595.75 +286,36450.0208333333 +287,36419.9583333333 +288,37283.6041666667 +289,37796.0625 +290,33925.9375 +291,30623.2291666667 +292,37481.2916666667 +293,37741.9583333333 +294,39801.875 +295,36788.5 +296,36692.125 +297,32177.1458333333 +298,30233.2708333333 +299,34876.625 +300,37327.9791666667 +301,38319.3333333333 +302,39201.4166666667 +303,35897.0833333333 +304,27388.125 +305,28612.6666666667 +306,33926.3333333333 +307,36528.3333333333 +308,33258.3333333333 +309,39291.2708333333 +310,37087.0833333333 +311,34048.9583333333 +312,32975.125 +313,39534.4375 +314,39823.2916666667 +315,38404.1458333333 +316,38064.3125 +317,30055.2083333333 +318,29113.7708333333 +319,29596.6041666667 +320,37315.125 +321,40023.2291666667 +322,37824.0833333333 +323,39791.7083333333 +324,37546.5833333333 +325,31181.7708333333 +326,27359.0833333333 +327,34509.0416666667 +328,34809.3333333333 +329,36160.7291666667 +330,32004.6041666667 +331,35182.3125 +332,30322.1666666667 +333,26749.5833333333 +334,26780.7083333333 +335,28270.1041666667 +336,24252.6875 +337,28454.8125 +338,32193.1041666667 +339,24372.25 +340,20305.2291666667 +341,30990 +342,32384.1041666667 +343,33452.8541666667 +344,34031.5833333333 +345,34688.4791666667 +346,31378.75 +347,30240.2083333333 +348,32059.1458333333 +349,32222.7291666667 +350,34901.0208333333 +351,35452.1041666667 +352,35971.2708333333 +353,33145.3333333333 +354,32811.625 +355,38172.6666666667 +356,40129.4166666667 +357,40813.9583333333 +358,38579.875 +359,37863.6666666667 +360,33448.8333333333 +361,29783.8541666667 +362,34660.0625 +363,37094.6458333333 +364,35711.75 +365,35905.2083333333 +366,35828.7916666667 +367,33670.9166666667 +368,29721 +369,33744.1041666667 +370,37893.5833333333 +371,39821.9791666667 +372,40011.0208333333 +373,40511.1458333333 +374,35121.7083333333 +375,32450.8541666667 +376,39577.7291666667 +377,41002.3958333333 +378,40349.1458333333 +379,39672.5208333333 +380,37276.8333333333 +381,33559.7916666667 +382,31932 +383,32710.5416666667 +384,34080.2291666667 +385,33123.4166666667 +386,35759.8333333333 +387,33062.5416666667 +388,32275.3333333333 +389,29755.7708333333 +390,37062.3333333333 +391,38360.7708333333 +392,37836.5 +393,37951 +394,34614.125 +395,34625.4375 diff --git a/Data/submission_lasso.csv b/Data/submission_lasso.csv new file mode 100644 index 0000000..66be5f3 --- /dev/null +++ b/Data/submission_lasso.csv @@ -0,0 +1,396 @@ +Id,Net_demand +1,5892.35636624559 +2,5892.33609266676 +3,5893.8519189405 +4,5894.56459278138 +5,5893.57579102625 +6,5891.80481866438 +7,5890.879582104 +8,5890.35636441461 +9,5890.19780555137 +10,5891.17483269522 +11,5893.67397180756 +12,5894.54440773347 +13,5892.97510878893 +14,5891.38739541472 +15,5888.98068257442 +16,5886.54041651851 +17,5886.68923698143 +18,5887.14402027592 +19,5887.09816126355 +20,5887.29992321179 +21,5887.46751222804 +22,5887.97293520414 +23,5887.81676667553 +24,5887.07381526277 +25,5886.36087582915 +26,5886.35405894894 +27,5886.65639201311 +28,5885.19439253381 +29,5885.30098375175 +30,5888.21037510988 +31,5889.02193797937 +32,5887.00697442428 +33,5887.07859593201 +34,5888.94447343145 +35,5887.59110138107 +36,5887.37712216698 +37,5887.00830238796 +38,5886.62496353938 +39,5888.15088233708 +40,5887.26867179989 +41,5887.03672081068 +42,5887.52762471723 +43,5888.77369730237 +44,5889.19368794848 +45,5890.19647758769 +46,5890.45631581415 +47,5890.20435683886 +48,5889.98993497021 +49,5890.26827615726 +50,5889.96302157299 +51,5889.64395616646 +52,5890.72235120445 +53,5889.5030149547 +54,5888.57742427067 +55,5889.94540392152 +56,5890.41125357999 +57,5890.72332504448 +58,5890.35344289451 +59,5888.38106270805 +60,5888.62850660684 +61,5887.48141158121 +62,5885.97789110423 +63,5885.31683078499 +64,5883.67458236904 +65,5882.9585443535 +66,5883.81800244633 +67,5885.88643867222 +68,5886.85948192503 +69,5885.94982680515 +70,5883.95929778174 +71,5883.94389340307 +72,5884.32422220064 +73,5883.85899225855 +74,5884.15689877713 +75,5885.20492771233 +76,5885.06265853689 +77,5885.3325007564 +78,5882.96544976463 +79,5881.37136216476 +80,5881.69910360066 +81,5881.52885865705 +82,5881.86412522046 +83,5882.60787341142 +84,5883.11772293312 +85,5882.55776491528 +86,5880.9918301454 +87,5881.84110718336 +88,5882.25428094925 +89,5880.65027788725 +90,5880.07411871253 +91,5879.36294989715 +92,5878.48445765826 +93,5878.21452690784 +94,5878.06349317212 +95,5877.85208135448 +96,5877.86252800208 +97,5877.85509140548 +98,5876.98846230879 +99,5877.02715031729 +100,5875.54053924448 +101,5874.03374312376 +102,5874.01346954493 +103,5875.59622518807 +104,5878.11112280273 +105,5877.39915720914 +106,5876.03861415489 +107,5873.43376913374 +108,5876.51933700657 +109,5883.36950484659 +110,5884.75191503608 +111,5884.31935300049 +112,5885.14038867755 +113,5885.9241528407 +114,5884.29810558163 +115,5884.27986821377 +116,5883.33347276545 +117,5880.96350025359 +118,5882.78918471902 +119,5883.39535587287 +120,5884.13653666739 +121,5886.92667688718 +122,5885.91733596048 +123,5883.92955139534 +124,5881.86563024596 +125,5883.2691993234 +126,5884.37397657314 +127,5883.71096857383 +128,5883.3085955792 +129,5882.82672182567 +130,5881.24414324435 +131,5881.64394884254 +132,5882.87691885272 +133,5883.15888980716 +134,5882.71561553122 +135,5882.74881462319 +136,5880.83061535481 +137,5879.45581882375 +138,5877.65014234441 +139,5876.44683018972 +140,5876.25356720901 +141,5876.49454835124 +142,5875.9784131348 +143,5874.97943032479 +144,5876.08270254903 +145,5876.95933563877 +146,5876.31075817811 +147,5876.90223320059 +148,5877.46838838226 +149,5877.05972969288 +150,5876.4430233605 +151,5878.11032602452 +152,5879.59454676271 +153,5880.80618082312 +154,5880.99014805807 +155,5881.21917752719 +156,5881.65616610838 +157,5880.81388301246 +158,5878.74456147745 +159,5877.29008712567 +160,5876.39920055911 +161,5876.51198894088 +162,5877.88412954459 +163,5878.56705699907 +164,5879.29150545124 +165,5879.16897866915 +166,5879.96965223648 +167,5880.60388768941 +168,5881.81357406976 +169,5883.76789395019 +170,5884.03747057696 +171,5882.90330106447 +172,5881.61367127066 +173,5882.09997156979 +174,5882.42948362392 +175,5881.80250770577 +176,5881.46865763695 +177,5879.80914569318 +178,5877.32487977405 +179,5876.86947676318 +180,5876.56856019359 +181,5877.10665107619 +182,5878.1205956103 +183,5878.79953917375 +184,5879.11267300918 +185,5878.75589343418 +186,5878.89116866758 +187,5879.45059549994 +188,5883.1235659733 +189,5884.97173729036 +190,5882.7370400119 +191,5882.2100154933 +192,5885.0723969372 +193,5886.44577697368 +194,5882.70596566182 +195,5881.52336974051 +196,5883.91281905299 +197,5885.10161213813 +198,5884.60831789696 +199,5883.41447854984 +200,5882.96084615721 +201,5884.09165149505 +202,5885.17287952222 +203,5886.62567178668 +204,5885.37411028499 +205,5884.44993609555 +206,5883.45414039838 +207,5881.55276200327 +208,5881.89033037038 +209,5887.10834231842 +210,5886.96421399383 +211,5885.40828321699 +212,5883.83464625777 +213,5882.51305680477 +214,5881.6049952413 +215,5880.69737633238 +216,5881.53151458441 +217,5883.22094997641 +218,5883.13410115182 +219,5883.29912277162 +220,5884.71349262031 +221,5885.4276714867 +222,5884.9125986412 +223,5883.76364446642 +224,5882.36715786194 +225,5882.51128618653 +226,5883.61269926161 +227,5883.45856694398 +228,5883.82437667199 +229,5884.55068427331 +230,5886.09422072248 +231,5883.91804237679 +232,5884.12626708161 +233,5885.56365496739 +234,5885.08452567213 +235,5884.7118990639 +236,5883.96726556382 +237,5885.10984551294 +238,5887.58924223192 +239,5889.2391928372 +240,5887.16429385474 +241,5886.93393642195 +242,5886.63151482686 +243,5886.94181567311 +244,5888.12742164542 +245,5889.55037899257 +246,5888.41063203263 +247,5889.12835213549 +248,5888.33617753571 +249,5888.43860780079 +250,5887.5898619483 +251,5886.36592209113 +252,5885.96602796203 +253,5885.65900275952 +254,5886.72225901157 +255,5886.76988864218 +256,5886.45144295204 +257,5885.47052044806 +258,5885.89272436697 +259,5885.9330944628 +260,5886.97970690341 +261,5888.12662486722 +262,5888.93358412929 +263,5889.52417384264 +264,5888.63390699247 +265,5888.12529690354 +266,5888.4788008348 +267,5890.1563730846 +268,5891.41590236836 +269,5891.79437201678 +270,5891.0245072068 +271,5890.79007735206 +272,5891.14030563958 +273,5891.58039280269 +274,5890.21781353747 +275,5891.02291365038 +276,5891.68441662418 +277,5891.58836058476 +278,5891.91256078418 +279,5893.0030845571 +280,5893.4193569049 +281,5893.45839903705 +282,5893.56525584773 +283,5893.25513206331 +284,5893.07780464675 +285,5893.22600539329 +286,5893.40289015529 +287,5893.39377147136 +288,5893.90034534931 +289,5894.65533696609 +290,5893.59694991419 +291,5893.38651193658 +292,5894.00985808735 +293,5894.03987006649 +294,5892.68171734686 +295,5893.36119209578 +296,5894.92092970182 +297,5896.03686184646 +298,5893.42183577043 +299,5892.56246620852 +300,5893.36393655405 +301,5893.27832716223 +302,5891.08338026322 +303,5891.45494450051 +304,5891.91194106779 +305,5892.02596888234 +306,5891.95496709098 +307,5891.04070836368 +308,5892.5088164759 +309,5895.55507662384 +310,5896.83611891919 +311,5895.68583678073 +312,5895.70132969032 +313,5895.87281406669 +314,5893.18554676654 +315,5892.50616054854 +316,5894.57397705804 +317,5893.90813606956 +318,5892.27624577031 +319,5892.96032412664 +320,5894.49606985556 +321,5893.75444640648 +322,5893.07868995587 +323,5892.3200685717 +324,5892.47871596585 +325,5893.50638279131 +326,5892.43436197898 +327,5890.48942637521 +328,5891.10020113648 +329,5892.53192304391 +330,5893.35570317924 +331,5893.1190600517 +332,5892.1944432077 +333,5892.33591560494 +334,5892.30838249133 +335,5892.76413962585 +336,5891.0579718915 +337,5890.09679178088 +338,5889.69140873524 +339,5889.61907898021 +340,5889.9668284022 +341,5891.17226529878 +342,5892.80176526341 +343,5894.15239285552 +344,5894.43772798461 +345,5894.12317765459 +346,5893.34693861896 +347,5894.03154816077 +348,5893.79924304791 +349,5894.24844889495 +350,5895.36066274129 +351,5896.37097750801 +352,5896.09104276455 +353,5896.42914231714 +354,5896.60363674451 +355,5897.04452068583 +356,5897.65733165808 +357,5896.87763991688 +358,5893.53480121403 +359,5890.84372708468 +360,5889.70858373215 +361,5889.48610555052 +362,5889.29390494076 +363,5889.47486212471 +364,5890.11529474147 +365,5892.37787925718 +366,5893.29532509731 +367,5894.89649517014 +368,5895.96869304429 +369,5896.20577882639 +370,5895.92274550101 +371,5895.74090300794 +372,5896.19046297863 +373,5896.52581807295 +374,5896.09104276455 +375,5894.43064551166 +376,5892.65533513511 +377,5891.54002270686 +378,5891.64749923392 +379,5892.74209542878 +380,5893.08125735231 +381,5893.85572576971 +382,5892.02623447507 +383,5890.81371510554 +384,5891.67060580192 +385,5889.44139744001 +386,5887.56640125664 +387,5887.02113937018 +388,5887.80879889346 +389,5889.25787285962 +390,5890.40328579792 +391,5891.22662327869 +392,5891.66396598353 +393,5891.26628512723 +394,5890.31201042774 +395,5887.62722199313 diff --git a/Data/submission_rf.csv b/Data/submission_rf.csv index cf0eebc..2e30b86 100644 --- a/Data/submission_rf.csv +++ b/Data/submission_rf.csv @@ -1,396 +1,396 @@ Id,Net_demand -1,40676.7164982502 -2,35168.044847931 -3,32973.3860690826 -4,39670.9936419427 -5,41000.1443795669 -6,40422.9731193034 -7,38539.4767977924 -8,36192.4825060315 -9,33502.2016944242 -10,32598.9937818716 -11,39783.845445693 -12,40081.4288553602 -13,40136.9517110556 -14,39617.6611512633 -15,37026.960545682 -16,31580.5858168975 -17,30802.3664235782 -18,37915.5115475995 -19,40077.9810647858 -20,39925.46862858 -21,40816.457414616 -22,40753.5821134689 -23,35617.2080803643 -24,33314.1852342921 -25,37616.0010253193 -26,37900.7510644755 -27,39443.9132062792 -28,43510.3481052734 -29,41022.7113710003 -30,31497.2777661217 -31,31508.9030226241 -32,40989.195430693 -33,42058.4191847392 -34,38643.8348471185 -35,41103.3729337733 -36,40761.0347626756 -37,36149.3423147614 -38,34077.4108899149 -39,40298.7764508831 -40,42024.5457498122 -41,42428.4780874058 -42,41905.1513792596 -43,39469.5030428775 -44,33527.5727822875 -45,31552.5000706956 -46,38884.5940573903 -47,39943.6221183333 -48,38937.1388364132 -49,38398.9179749979 -50,37623.2187310422 -51,34172.6424159557 -52,29090.7511271631 -53,35790.660028676 -54,39544.782502602 -55,38969.9698944366 -56,38431.6102376418 -57,38010.8679240209 -58,33331.2861794982 -59,32704.673716951 -60,37015.9295165047 -61,30312.2322877301 -62,36933.1620864821 -63,39399.5318395517 -64,41020.6531549246 -65,40397.0984145234 -66,37582.4261165025 -67,41480.1576712215 -68,39798.8716020662 -69,43478.9769762072 -70,46522.8478115491 -71,41681.6530475459 -72,39690.4299244686 -73,40070.674871261 -74,46092.3394058634 -75,45041.4188818052 -76,43528.9198508219 -77,41943.4635719967 -78,46332.3732913523 -79,45425.7443566564 -80,42158.2238894801 -81,50124.6579388479 -82,49763.1741707025 -83,49923.3523303235 -84,49804.780044431 -85,51253.5279524509 -86,47722.850740638 -87,45497.092164867 -88,53021.7558683443 -89,56755.8980124549 -90,57446.9842299833 -91,58150.9006985877 -92,59949.9242376377 -93,54892.641929288 -94,55300.9216229263 -95,63384.2647291392 -96,64715.6986558518 -97,64546.5571178782 -98,66558.3583777307 -99,66253.6768276943 -100,61603.471310938 -101,62946.6554953989 -102,72398.5686302019 -103,71645.3392764581 -104,67020.7649722744 -105,65793.2168274134 -106,67034.8564379869 -107,65139.9093607967 -108,58748.7246322163 -109,52972.470297092 -110,48147.8579555801 -111,48718.2563386563 -112,44688.2260901385 -113,42949.8525863448 -114,41663.8250590011 -115,34966.2944940531 -116,46322.3170328317 -117,48864.3131790168 -118,44421.6445690582 -119,45164.0348298191 -120,40932.2344490091 -121,33287.3989505859 -122,27255.9636481907 -123,43618.1092151687 -124,49889.6642599254 -125,47513.7471295296 -126,49437.1707321421 -127,49480.2436719293 -128,42040.0185505358 -129,40839.5773744359 -130,49044.1741323806 -131,52139.8871545174 -132,51047.6247922693 -133,48058.1717608176 -134,48948.2937369065 -135,43302.3651214376 -136,43884.4524797283 -137,53488.1582535669 -138,62774.6130254974 -139,65000.5644841467 -140,67143.126647408 -141,65599.9056930422 -142,60665.1809907384 -143,61164.6736128467 -144,68453.5024221279 -145,68798.6415963634 -146,70651.485464213 -147,68413.1038773762 -148,65992.9548858896 -149,62127.6685738272 -150,62230.5879373177 -151,65047.8228945904 -152,64053.5831980216 -153,59458.0672792367 -154,58074.9720717805 -155,57788.1158093792 -156,52669.7266516188 -157,49245.935252097 -158,58262.5793296087 -159,62103.3196546783 -160,65226.6513188003 -161,66743.2986009518 -162,65326.6671339295 -163,57761.1499589839 -164,53719.2881865165 -165,60412.1337616377 -166,59827.7288664622 -167,58240.9985386169 -168,55669.458987154 -169,50723.4497375371 -170,43602.3276113756 -171,43282.334724325 -172,52167.0984702906 -173,54262.9049634948 -174,53912.5796852764 -175,53094.5309554322 -176,52588.2851153965 -177,48197.2226088192 -178,46740.4265922999 -179,57353.9625048307 -180,62933.4494069157 -181,62807.5125166997 -182,62092.1601870667 -183,60274.0814219325 -184,53816.4966937272 -185,53732.7879623588 -186,60018.6060377667 -187,59103.7174764193 -188,49286.7291186333 -189,44568.7271267353 -190,43153.7544286071 -191,45531.2299740325 -192,39255.4150816654 -193,39553.364729546 -194,42115.2715610819 -195,49604.7652147932 -196,45903.4296027342 -197,43162.4817458167 -198,38880.893771134 -199,38277.8936262228 -200,46601.1572995671 -201,46485.6131910747 -202,41819.5945426147 -203,38759.3190129816 -204,36521.2446755771 -205,33501.9054507249 -206,33908.3504457074 -207,46045.3716012204 -208,47331.1099076956 -209,42786.3402684559 -210,37072.2787659564 -211,34656.8775571905 -212,33555.1149512696 -213,36393.9682894606 -214,46469.4718657073 -215,48808.613830095 -216,49652.6219658502 -217,47808.8244355859 -218,46282.3851550067 -219,40094.1692941077 -220,37588.5216280916 -221,36654.8382702953 -222,38840.1981780673 -223,40331.0959646951 -224,43731.2625606633 -225,44244.2442891156 -226,37422.4550298973 -227,37482.6215186745 -228,43147.4108999101 -229,42354.0058986856 -230,40140.2660058258 -231,41214.6870831537 -232,43039.5307112941 -233,37127.4161031626 -234,32633.5147497453 -235,41000.5861356522 -236,44253.2763678897 -237,44064.2074343133 -238,41865.0958661221 -239,37828.048730821 -240,33851.9699446543 -241,33215.6856065624 -242,33955.8690212943 -243,35556.0220295954 -244,36397.6220344945 -245,36974.5409873931 -246,37668.2704083687 -247,33263.2225222616 -248,31784.8156633465 -249,32589.711694583 -250,35486.9556251062 -251,35791.5027484294 -252,39425.0701283643 -253,39243.6300452731 -254,33909.8612661483 -255,31641.0970274646 -256,37362.190046708 -257,36998.7596535644 -258,37522.8289679725 -259,33992.8722794582 -260,34649.5920677011 -261,29953.937171059 -262,29868.0472717899 -263,36877.3109796349 -264,35601.2685745126 -265,35871.1652262855 -266,34694.5651681942 -267,34093.433480017 -268,30840.6931230362 -269,28636.9310851679 -270,28097.0573870811 -271,31363.6454218032 -272,33433.3271801955 -273,35213.6918855584 -274,34739.2892739712 -275,30460.1894966062 -276,29422.7289982778 -277,35693.4523484578 -278,36334.6347507989 -279,36605.8674531759 -280,37278.6144289901 -281,37682.966917653 -282,33919.0205965739 -283,31776.2987377481 -284,38597.2833803638 -285,38473.2989088864 -286,38223.2661185076 -287,38787.3262271727 -288,39443.7635008945 -289,35413.5524356465 -290,32173.5061937582 -291,38580.8383426333 -292,38370.7987222135 -293,39858.5000343725 -294,38117.0275062831 -295,37801.6555238393 -296,33813.5563002909 -297,31562.4120874436 -298,36835.7629644242 -299,39005.7288638166 -300,39724.4874492936 -301,39401.7770967301 -302,36414.1045071296 -303,30052.0751268338 -304,28776.4524875204 -305,36175.1222588538 -306,37811.4971418832 -307,36978.2137612291 -308,39675.0263242545 -309,38615.9179804603 -310,34689.8876586096 -311,33587.2973797087 -312,40408.3450016547 -313,40402.061578629 -314,39715.6591588678 -315,39621.2983895419 -316,32602.8351337606 -317,28892.0800581299 -318,30416.6547294614 -319,38842.9581215963 -320,40851.2228962195 -321,39243.1533951267 -322,40557.2000387108 -323,37726.8927760493 -324,32302.8932079509 -325,29607.7003848948 -326,35950.0621005357 -327,35999.3180690477 -328,35960.7180828372 -329,35441.3275243402 -330,35886.9125619478 -331,30211.0055251506 -332,27398.6995406993 -333,33009.744518628 -334,32370.6267872805 -335,30950.504124993 -336,31673.6033694208 -337,31665.9308678881 -338,25227.493596207 -339,23392.6945239494 -340,33227.9326549708 -341,33682.1304904259 -342,34343.9569096979 -343,34554.5721477548 -344,35030.421118031 -345,30104.1484652234 -346,29634.054708072 -347,35810.105443236 -348,30560.2153329981 -349,34465.5932190617 -350,36101.3486042348 -351,36850.6859511551 -352,32355.3447573198 -353,32505.0914254837 -354,39436.2368502314 -355,40006.543449756 -356,41002.1713761356 -357,39799.6668027332 -358,37877.9995724496 -359,33478.7100211586 -360,29718.2181624963 -361,34999.1128756236 -362,36668.3411735859 -363,37159.1974157738 -364,37532.1062944518 -365,37396.0869394424 -366,33580.6689472131 -367,31130.4273337166 -368,37535.2379236542 -369,40219.169107709 -370,41319.2988556587 -371,41576.5908101236 -372,41506.2931262037 -373,36841.7286108739 -374,34153.2041259957 -375,40381.6447889347 -376,41036.9114892907 -377,40301.0984173007 -378,40286.1261836805 -379,38856.612197999 -380,33938.5606888223 -381,31290.5038573627 -382,36146.4104768613 -383,36735.7988223096 -384,36414.0153120275 -385,36880.158573127 -386,35777.7932359207 -387,31977.5824991764 -388,29944.091416779 -389,37992.5174854393 -390,38716.5673152219 -391,38002.2230723678 -392,38518.897573551 -393,36405.2326012647 -394,33839.734021182 -395,33986.0580620832 +1,40454.59205625 +2,36372.6457861111 +3,34367.8438805556 +4,39376.9837381944 +5,40354.2323263889 +6,40194.8983121528 +7,39181.4485920139 +8,38211.3678850694 +9,34562.8228777778 +10,34459.7751402778 +11,40136.8109409722 +12,40155.2224302084 +13,40452.9600225695 +14,39861.8274513889 +15,38494.1435902778 +16,34979.3761177083 +17,34707.7863611111 +18,39605.9378642361 +19,41005.3152618056 +20,41119.2886274306 +21,41232.9344638889 +22,40770.6229659722 +23,37172.5521708333 +24,35276.1071239583 +25,38559.3954413194 +26,39085.6782909722 +27,39717.4080180556 +28,42267.5859253472 +29,43076.8792593751 +30,36003.8728406249 +31,34205.6492315972 +32,39755.823909375 +33,41505.3204159722 +34,40701.9754319444 +35,41647.1358194445 +36,41888.9705013888 +37,37779.0630125 +38,36320.4919413194 +39,40723.6996121528 +40,41685.2452451388 +41,41437.3347819444 +42,42335.2542291666 +43,40786.144471875 +44,35939.1192010416 +45,34008.6221618055 +46,39805.2933652778 +47,40655.3841815972 +48,40525.5194913195 +49,40085.3861697917 +50,38885.8187878472 +51,35193.3003027778 +52,32939.412878125 +53,37442.6510350694 +54,39377.7466100694 +55,39119.06696875 +56,38891.7866118055 +57,38454.5032166666 +58,34975.3447993055 +59,34481.6020114583 +60,37915.2633024305 +61,35825.7465538194 +62,38969.7526131944 +63,38958.9115850694 +64,40970.4733951389 +65,42113.4394302083 +66,41112.2515753472 +67,40835.6807618055 +68,40106.4434795139 +69,41216.6148333333 +70,45162.5887520833 +71,45493.3166510417 +72,42252.0456284722 +73,41780.5718996527 +74,45998.215634375 +75,45749.8886100694 +76,45179.470425 +77,44446.4511263889 +78,45353.3025604167 +79,46836.6666822917 +80,47173.3847017362 +81,50199.3122784722 +82,51624.0644347222 +83,50941.7913756944 +84,50272.2888173611 +85,51001.0204326389 +86,50635.1151868056 +87,49209.2554635417 +88,51788.2261006944 +89,55261.3794347222 +90,57998.3590736111 +91,59154.6142836805 +92,60927.4609739582 +93,59381.4830083333 +94,59068.8563861111 +95,64258.4974597222 +96,66666.0259673611 +97,66950.7474680555 +98,68210.7552819444 +99,69055.4304374999 +100,67295.6148961805 +101,67272.8998215277 +102,71469.0129555556 +103,73047.7136638889 +104,70799.1978326388 +105,69688.4016125 +106,70524.2349770834 +107,69408.9674388889 +108,68315.6562652778 +109,60528.6915326389 +110,53243.0423409723 +111,51676.5483868056 +112,49367.5673003473 +113,46625.8501677084 +114,45539.2005340277 +115,45116.4965631944 +116,47856.5637875 +117,50465.8210236111 +118,50317.4700013889 +119,47575.8187868055 +120,46116.2612302084 +121,40278.3869479167 +122,37384.8998784722 +123,43276.7289722222 +124,49117.8321079861 +125,48903.4621836806 +126,47026.3384725695 +127,48236.8522503473 +128,44794.7754399305 +129,43057.8932434028 +130,48648.8749371528 +131,52909.1992211806 +132,51389.8967090278 +133,50151.7518565972 +134,49918.47255625 +135,47521.4790489583 +136,47031.0508427084 +137,52606.6581208333 +138,60373.7610333333 +139,65924.5028586805 +140,67937.4513190971 +141,68842.5853770832 +142,66510.6542593749 +143,64948.2003444444 +144,70007.0858232639 +145,71180.532784375 +146,71899.6721079861 +147,72083.2079270833 +148,70120.3298038195 +149,66909.199607986 +150,67751.0675118055 +151,68715.2597892362 +152,66558.9259611112 +153,62654.1684940972 +154,60203.5735996528 +155,59286.9326642361 +156,55624.4202934029 +157,54565.021784375 +158,58533.8778416667 +159,64136.5714013889 +160,67402.1304159722 +161,69595.2233673611 +162,68999.6910565972 +163,64101.436142361 +164,58903.7606263889 +165,62077.6495055555 +166,62346.2876736111 +167,60858.6962225694 +168,58760.4667520833 +169,53804.276576389 +170,48167.3135503472 +171,47425.0708451388 +172,52519.8991052084 +173,54976.529009375 +174,54773.8655031249 +175,54525.281903125 +176,54275.1088041667 +177,52349.2892173611 +178,53360.470403125 +179,60195.233215625 +180,65477.0681163194 +181,67118.9267329861 +182,65811.0035975694 +183,63948.1638357638 +184,59841.7502576389 +185,58990.1494767361 +186,63187.4173017361 +187,63413.8563666666 +188,56102.7967958334 +189,50522.0457454862 +190,49195.0904572917 +191,49692.3520447917 +192,46083.8547739583 +193,44334.3819576389 +194,46862.3311715278 +195,50318.3960236112 +196,49043.8959434028 +197,45764.2094940972 +198,43887.9448850694 +199,41349.0476944444 +200,46597.1228555555 +201,47776.6680368055 +202,46624.0293173611 +203,42617.0081277777 +204,41440.8021024306 +205,39420.9858638889 +206,40268.6816958333 +207,46962.7822506945 +208,50435.8799489584 +209,45728.7646555556 +210,41348.3837201389 +211,39861.9134253472 +212,39221.6039423611 +213,40844.91225 +214,47469.6711531251 +215,51129.5178864584 +216,51493.2086041667 +217,49642.1245847223 +218,48343.4557260417 +219,45200.6780045139 +220,41866.0244784722 +221,41962.8151263888 +222,43638.6386163194 +223,45821.4215899306 +224,46866.3266222222 +225,47636.477646875 +226,43942.0315885417 +227,42304.4347444445 +228,43655.3728631944 +229,44782.4400006944 +230,42625.6787413194 +231,43651.5661173611 +232,45892.6813729167 +233,41409.36511875 +234,38324.8931895833 +235,42962.4413048611 +236,44892.5868923611 +237,45351.2604513889 +238,43457.1763041667 +239,41037.1301190972 +240,36086.1267652778 +241,35713.2312083333 +242,37561.2264840278 +243,40439.1064465277 +244,39975.4335371527 +245,38977.7492253472 +246,38147.582639236 +247,35761.5125277778 +248,34295.4087204861 +249,35650.0372663194 +250,38046.9609100694 +251,37601.4535909722 +252,38735.7881954861 +253,39555.1067940972 +254,35946.2881190972 +255,34478.392065625 +256,37360.4313579861 +257,38177.2249 +258,38558.7750322917 +259,37683.9855538194 +260,38621.0245375 +261,33917.4019645834 +262,33445.8256878472 +263,37782.3978996528 +264,37260.9331968749 +265,37179.7387208333 +266,36176.2048232639 +267,36337.0780916666 +268,33502.0341302083 +269,32775.2508972222 +270,34185.7903041667 +271,36017.60065 +272,36182.677459375 +273,36784.86156875 +274,36369.65725625 +275,33248.0093364583 +276,32722.8674020833 +277,36395.7150104167 +278,36959.8870284723 +279,37170.1183083334 +280,37333.69195 +281,37489.1814270834 +282,34748.1704809028 +283,34034.9871072917 +284,38283.2049371528 +285,38487.5837798611 +286,38135.6680649306 +287,38812.5121729167 +288,39124.7673180556 +289,35666.8975010416 +290,34215.6702482639 +291,38560.8321107639 +292,38626.8371670139 +293,39298.0543413194 +294,39043.8491701389 +295,38834.3655604167 +296,35460.8799065972 +297,34202.3205336805 +298,37893.2843201389 +299,38878.0826215277 +300,40023.7303819445 +301,39352.2304774306 +302,37931.0856569445 +303,33090.3876791667 +304,32340.484884375 +305,36682.1118878472 +306,38005.1560354167 +307,37824.9083986111 +308,39548.2569211806 +309,38959.3002295139 +310,35147.3306725694 +311,34308.4113729167 +312,38928.1134861111 +313,39418.7962767361 +314,38665.4381548611 +315,39370.5772760417 +316,36325.4913618056 +317,32950.1093815972 +318,32846.9296149305 +319,38850.3603597222 +320,40754.5379291667 +321,39325.9135736111 +322,39810.7724899306 +323,38043.5084767361 +324,34627.6647197917 +325,32515.2159590278 +326,37167.2197829861 +327,38401.5928840278 +328,38069.6141916666 +329,38139.2701420139 +330,37498.0468930556 +331,33465.7459083333 +332,32342.7451701389 +333,35911.4614482639 +334,35936.6415784722 +335,35895.7142121528 +336,35705.5185496527 +337,36019.9962114583 +338,32442.9474333333 +339,32113.3956979167 +340,36671.1861100694 +341,37159.2764246528 +342,37859.3951329861 +343,37927.7060236111 +344,37686.0765784722 +345,34001.1132861111 +346,34015.3789833333 +347,37759.2041892361 +348,35610.0913993056 +349,38071.8412690972 +350,38363.2915145834 +351,38350.71995625 +352,34896.5704822917 +353,34486.6724670139 +354,38424.1845642361 +355,38914.5447003473 +356,39540.6738072917 +357,39724.8578934028 +358,38114.6923829861 +359,35103.4642645833 +360,33238.1748065972 +361,37391.2110430555 +362,38871.5242090278 +363,39388.3064107639 +364,38966.5646319445 +365,38667.3853888889 +366,34941.1429979167 +367,33836.1532958333 +368,37685.3446131945 +369,39426.3873670139 +370,39870.2261420139 +371,40312.2562770833 +372,40285.0443621528 +373,36924.7307423611 +374,34968.7264423611 +375,39262.4797934028 +376,40636.2799625 +377,41130.6777145833 +378,41002.4842576389 +379,40609.7329961806 +380,35841.6664847222 +381,33792.9358461805 +382,38073.7263774306 +383,38538.0539319445 +384,38268.249871875 +385,38556.6382059028 +386,37707.5013107639 +387,35141.2368020833 +388,34528.666575 +389,38938.3063763889 +390,39523.2306819445 +391,39350.1608045139 +392,39413.3568319445 +393,37902.7018756944 +394,34987.354575 +395,35350.3461475695 diff --git a/Data/submission_rfcomplet.csv b/Data/submission_rfcomplet.csv new file mode 100644 index 0000000..969004d --- /dev/null +++ b/Data/submission_rfcomplet.csv @@ -0,0 +1,396 @@ +Id,Net_demand +1,40309.5625 +2,40596.9791666667 +3,35496.3333333333 +4,32913.1875 +5,38491.2083333333 +6,39991.2291666667 +7,40000.8541666667 +8,36224.75 +9,33317.8958333333 +10,32888.2083333333 +11,33371.3125 +12,38807.9791666667 +13,41194.3541666667 +14,40933.4583333333 +15,40659.5625 +16,37828.6875 +17,31297.7916666667 +18,30686.4583333333 +19,37698.5416666667 +20,39634.0833333333 +21,39512.4375 +22,40840.7708333333 +23,42086.625 +24,36698.625 +25,33634.9166666667 +26,35443.3541666667 +27,36628.8125 +28,40641.0625 +29,42883.4583333333 +30,40091.8541666667 +31,29867.5 +32,32048.875 +33,41346.4583333333 +34,41669.0416666667 +35,35995.75 +36,41202.75 +37,41076.1458333333 +38,36779.2916666667 +39,33008.3958333333 +40,39929.5833333333 +41,41526.2291666667 +42,43202.5833333333 +43,42081.6458333333 +44,39314.0208333333 +45,31867.7916666667 +46,32384.3125 +47,37325.7083333333 +48,39501.8333333333 +49,36310.1458333333 +50,37335.4166666667 +51,35495.3125 +52,33249.3125 +53,25689.4583333333 +54,31108.375 +55,38410.125 +56,36902.7916666667 +57,35749.3333333333 +58,35974.1458333333 +59,31453.375 +60,31908.75 +61,32418.2083333333 +62,25811.2291666667 +63,35885.375 +64,36437.2291666667 +65,39712.6875 +66,39262.9375 +67,33642 +68,36619.6041666667 +69,36398.1041666667 +70,41812.5416666667 +71,44955.0625 +72,39947.3541666667 +73,39516.2083333333 +74,39910.0416666667 +75,45408.4791666667 +76,42256.2708333333 +77,40008.7916666667 +78,38516.9166666667 +79,45221.6041666667 +80,45481 +81,40378.5416666667 +82,47154.9166666667 +83,45390.5625 +84,46389.5416666667 +85,46446.625 +86,49811.6666666667 +87,47523.7083333333 +88,43471.8958333333 +89,51836.875 +90,56769.7083333333 +91,57592.5833333333 +92,57416.7291666667 +93,59242.4791666667 +94,53426.7083333333 +95,55187.3958333333 +96,62918.6666666667 +97,63730.3125 +98,63373.1875 +99,65572.1458333333 +100,64320.4166666667 +101,61625.1458333333 +102,62985.6458333333 +103,70685.2083333333 +104,69177.6666666667 +105,67430.6666666667 +106,64044.7916666667 +107,65086.0625 +108,65602.0416666667 +109,58230.1875 +110,49501.4583333333 +111,47834.8333333333 +112,47425.3541666667 +113,41866.6458333333 +114,38276.6666666667 +115,39792.625 +116,36234.5 +117,39819.6041666667 +118,45928.4375 +119,38560.6666666667 +120,39960.5416666667 +121,37918.1666666667 +122,29087.9583333333 +123,31844.5833333333 +124,42440.7083333333 +125,47643.5625 +126,42026.5 +127,47397.3333333333 +128,47225.5208333333 +129,38291.3541666667 +130,38075.75 +131,44429.7916666667 +132,48979.7916666667 +133,45651.3958333333 +134,42880.8958333333 +135,44328.3125 +136,39689.6666666667 +137,38962.3333333333 +138,50746.625 +139,62447.1666666667 +140,64377.6458333333 +141,67070.9791666667 +142,66298.1041666667 +143,58245.5 +144,62490.25 +145,67615.1875 +146,67373.1875 +147,71625.4791666667 +148,68463.2708333333 +149,63235.8125 +150,61212.1666666667 +151,61480.9375 +152,63116.625 +153,60732.8125 +154,56162.3333333333 +155,56593.4791666667 +156,55219.8333333333 +157,52522.9583333333 +158,46091.1666666667 +159,55473.25 +160,58059.8541666667 +161,63633.4583333333 +162,67228.2916666667 +163,64153.375 +164,57244.0416666667 +165,52551.0833333333 +166,58590 +167,58156.2083333333 +168,55974.6041666667 +169,52037 +170,47319.25 +171,41617.1041666667 +172,42526.7916666667 +173,51303.125 +174,54184.0208333333 +175,53918.2916666667 +176,54757.6875 +177,51951.3958333333 +178,48022.0416666667 +179,41885.125 +180,53586.1666666667 +181,60097.4583333333 +182,58635.375 +183,61386.5625 +184,58519.6666666667 +185,53606.5 +186,52976.6041666667 +187,58802.5625 +188,54050.6666666667 +189,46577.8333333333 +190,39825.625 +191,42208.8333333333 +192,46992.0208333333 +193,35790.5416666667 +194,33368.9166666667 +195,38509.5833333333 +196,49210.0833333333 +197,43049.9583333333 +198,41882 +199,37674.625 +200,39486.9166666667 +201,46225.7291666667 +202,44126.2708333333 +203,37719.3125 +204,34921.4583333333 +205,33728.9166666667 +206,31419.9375 +207,32807.1458333333 +208,45676.1666666667 +209,46475.1041666667 +210,41484.1875 +211,34098.1041666667 +212,30854.8125 +213,31064.8125 +214,36078.6666666667 +215,43873.6458333333 +216,45632.6666666667 +217,49354.6458333333 +218,45558.2291666667 +219,44956.1666666667 +220,39456.0208333333 +221,36057.8125 +222,33241.375 +223,38388.2916666667 +224,36261.5833333333 +225,39928.9375 +226,43844.625 +227,37141.2708333333 +228,37039.75 +229,41854.3958333333 +230,39222.2916666667 +231,37890.0625 +232,38307.0625 +233,41926.8958333333 +234,35888.9791666667 +235,30495.5625 +236,38664.9583333333 +237,43763.75 +238,44180.5625 +239,41684.9166666667 +240,36665.4791666667 +241,36302.0833333333 +242,32645.9791666667 +243,31653.375 +244,36514.9375 +245,33619.125 +246,33427.9375 +247,36877.2708333333 +248,33381.7708333333 +249,32190.6875 +250,32654.8958333333 +251,36470.5833333333 +252,34920.5 +253,39152.4791666667 +254,38541.5208333333 +255,32278.3333333333 +256,31430.25 +257,35415.8958333333 +258,33463.625 +259,33851.8541666667 +260,30976.3958333333 +261,31574.625 +262,29349.7083333333 +263,30024.2708333333 +264,35590.5 +265,33563.1666666667 +266,33006.1458333333 +267,31380.0833333333 +268,31721.2291666667 +269,28989.1666666667 +270,27466.1666666667 +271,25624.9791666667 +272,29054.9583333333 +273,31420 +274,33059.3333333333 +275,31627.1458333333 +276,28827.3541666667 +277,27355.0208333333 +278,32402.3125 +279,34007.375 +280,34461.8333333333 +281,35336.5416666667 +282,36574.3958333333 +283,32460.0416666667 +284,31221.8541666667 +285,36595.75 +286,36450.0208333333 +287,36419.9583333333 +288,37283.6041666667 +289,37796.0625 +290,33925.9375 +291,30623.2291666667 +292,37481.2916666667 +293,37741.9583333333 +294,39801.875 +295,36788.5 +296,36692.125 +297,32177.1458333333 +298,30233.2708333333 +299,34876.625 +300,37327.9791666667 +301,38319.3333333333 +302,39201.4166666667 +303,35897.0833333333 +304,27388.125 +305,28612.6666666667 +306,33926.3333333333 +307,36528.3333333333 +308,33258.3333333333 +309,39291.2708333333 +310,37087.0833333333 +311,34048.9583333333 +312,32975.125 +313,39534.4375 +314,39823.2916666667 +315,38404.1458333333 +316,38064.3125 +317,30055.2083333333 +318,29113.7708333333 +319,29596.6041666667 +320,37315.125 +321,40023.2291666667 +322,37824.0833333333 +323,39791.7083333333 +324,37546.5833333333 +325,31181.7708333333 +326,27359.0833333333 +327,34509.0416666667 +328,34809.3333333333 +329,36160.7291666667 +330,32004.6041666667 +331,35182.3125 +332,30322.1666666667 +333,26749.5833333333 +334,26780.7083333333 +335,28270.1041666667 +336,24252.6875 +337,28454.8125 +338,32193.1041666667 +339,24372.25 +340,20305.2291666667 +341,30990 +342,32384.1041666667 +343,33452.8541666667 +344,34031.5833333333 +345,34688.4791666667 +346,31378.75 +347,30240.2083333333 +348,32059.1458333333 +349,32222.7291666667 +350,34901.0208333333 +351,35452.1041666667 +352,35971.2708333333 +353,33145.3333333333 +354,32811.625 +355,38172.6666666667 +356,40129.4166666667 +357,40813.9583333333 +358,38579.875 +359,37863.6666666667 +360,33448.8333333333 +361,29783.8541666667 +362,34660.0625 +363,37094.6458333333 +364,35711.75 +365,35905.2083333333 +366,35828.7916666667 +367,33670.9166666667 +368,29721 +369,33744.1041666667 +370,37893.5833333333 +371,39821.9791666667 +372,40011.0208333333 +373,40511.1458333333 +374,35121.7083333333 +375,32450.8541666667 +376,39577.7291666667 +377,41002.3958333333 +378,40349.1458333333 +379,39672.5208333333 +380,37276.8333333333 +381,33559.7916666667 +382,31932 +383,32710.5416666667 +384,34080.2291666667 +385,33123.4166666667 +386,35759.8333333333 +387,33062.5416666667 +388,32275.3333333333 +389,29755.7708333333 +390,37062.3333333333 +391,38360.7708333333 +392,37836.5 +393,37951 +394,34614.125 +395,34625.4375 diff --git a/Data/submission_rfmixte.csv b/Data/submission_rfmixte.csv new file mode 100644 index 0000000..969004d --- /dev/null +++ b/Data/submission_rfmixte.csv @@ -0,0 +1,396 @@ +Id,Net_demand +1,40309.5625 +2,40596.9791666667 +3,35496.3333333333 +4,32913.1875 +5,38491.2083333333 +6,39991.2291666667 +7,40000.8541666667 +8,36224.75 +9,33317.8958333333 +10,32888.2083333333 +11,33371.3125 +12,38807.9791666667 +13,41194.3541666667 +14,40933.4583333333 +15,40659.5625 +16,37828.6875 +17,31297.7916666667 +18,30686.4583333333 +19,37698.5416666667 +20,39634.0833333333 +21,39512.4375 +22,40840.7708333333 +23,42086.625 +24,36698.625 +25,33634.9166666667 +26,35443.3541666667 +27,36628.8125 +28,40641.0625 +29,42883.4583333333 +30,40091.8541666667 +31,29867.5 +32,32048.875 +33,41346.4583333333 +34,41669.0416666667 +35,35995.75 +36,41202.75 +37,41076.1458333333 +38,36779.2916666667 +39,33008.3958333333 +40,39929.5833333333 +41,41526.2291666667 +42,43202.5833333333 +43,42081.6458333333 +44,39314.0208333333 +45,31867.7916666667 +46,32384.3125 +47,37325.7083333333 +48,39501.8333333333 +49,36310.1458333333 +50,37335.4166666667 +51,35495.3125 +52,33249.3125 +53,25689.4583333333 +54,31108.375 +55,38410.125 +56,36902.7916666667 +57,35749.3333333333 +58,35974.1458333333 +59,31453.375 +60,31908.75 +61,32418.2083333333 +62,25811.2291666667 +63,35885.375 +64,36437.2291666667 +65,39712.6875 +66,39262.9375 +67,33642 +68,36619.6041666667 +69,36398.1041666667 +70,41812.5416666667 +71,44955.0625 +72,39947.3541666667 +73,39516.2083333333 +74,39910.0416666667 +75,45408.4791666667 +76,42256.2708333333 +77,40008.7916666667 +78,38516.9166666667 +79,45221.6041666667 +80,45481 +81,40378.5416666667 +82,47154.9166666667 +83,45390.5625 +84,46389.5416666667 +85,46446.625 +86,49811.6666666667 +87,47523.7083333333 +88,43471.8958333333 +89,51836.875 +90,56769.7083333333 +91,57592.5833333333 +92,57416.7291666667 +93,59242.4791666667 +94,53426.7083333333 +95,55187.3958333333 +96,62918.6666666667 +97,63730.3125 +98,63373.1875 +99,65572.1458333333 +100,64320.4166666667 +101,61625.1458333333 +102,62985.6458333333 +103,70685.2083333333 +104,69177.6666666667 +105,67430.6666666667 +106,64044.7916666667 +107,65086.0625 +108,65602.0416666667 +109,58230.1875 +110,49501.4583333333 +111,47834.8333333333 +112,47425.3541666667 +113,41866.6458333333 +114,38276.6666666667 +115,39792.625 +116,36234.5 +117,39819.6041666667 +118,45928.4375 +119,38560.6666666667 +120,39960.5416666667 +121,37918.1666666667 +122,29087.9583333333 +123,31844.5833333333 +124,42440.7083333333 +125,47643.5625 +126,42026.5 +127,47397.3333333333 +128,47225.5208333333 +129,38291.3541666667 +130,38075.75 +131,44429.7916666667 +132,48979.7916666667 +133,45651.3958333333 +134,42880.8958333333 +135,44328.3125 +136,39689.6666666667 +137,38962.3333333333 +138,50746.625 +139,62447.1666666667 +140,64377.6458333333 +141,67070.9791666667 +142,66298.1041666667 +143,58245.5 +144,62490.25 +145,67615.1875 +146,67373.1875 +147,71625.4791666667 +148,68463.2708333333 +149,63235.8125 +150,61212.1666666667 +151,61480.9375 +152,63116.625 +153,60732.8125 +154,56162.3333333333 +155,56593.4791666667 +156,55219.8333333333 +157,52522.9583333333 +158,46091.1666666667 +159,55473.25 +160,58059.8541666667 +161,63633.4583333333 +162,67228.2916666667 +163,64153.375 +164,57244.0416666667 +165,52551.0833333333 +166,58590 +167,58156.2083333333 +168,55974.6041666667 +169,52037 +170,47319.25 +171,41617.1041666667 +172,42526.7916666667 +173,51303.125 +174,54184.0208333333 +175,53918.2916666667 +176,54757.6875 +177,51951.3958333333 +178,48022.0416666667 +179,41885.125 +180,53586.1666666667 +181,60097.4583333333 +182,58635.375 +183,61386.5625 +184,58519.6666666667 +185,53606.5 +186,52976.6041666667 +187,58802.5625 +188,54050.6666666667 +189,46577.8333333333 +190,39825.625 +191,42208.8333333333 +192,46992.0208333333 +193,35790.5416666667 +194,33368.9166666667 +195,38509.5833333333 +196,49210.0833333333 +197,43049.9583333333 +198,41882 +199,37674.625 +200,39486.9166666667 +201,46225.7291666667 +202,44126.2708333333 +203,37719.3125 +204,34921.4583333333 +205,33728.9166666667 +206,31419.9375 +207,32807.1458333333 +208,45676.1666666667 +209,46475.1041666667 +210,41484.1875 +211,34098.1041666667 +212,30854.8125 +213,31064.8125 +214,36078.6666666667 +215,43873.6458333333 +216,45632.6666666667 +217,49354.6458333333 +218,45558.2291666667 +219,44956.1666666667 +220,39456.0208333333 +221,36057.8125 +222,33241.375 +223,38388.2916666667 +224,36261.5833333333 +225,39928.9375 +226,43844.625 +227,37141.2708333333 +228,37039.75 +229,41854.3958333333 +230,39222.2916666667 +231,37890.0625 +232,38307.0625 +233,41926.8958333333 +234,35888.9791666667 +235,30495.5625 +236,38664.9583333333 +237,43763.75 +238,44180.5625 +239,41684.9166666667 +240,36665.4791666667 +241,36302.0833333333 +242,32645.9791666667 +243,31653.375 +244,36514.9375 +245,33619.125 +246,33427.9375 +247,36877.2708333333 +248,33381.7708333333 +249,32190.6875 +250,32654.8958333333 +251,36470.5833333333 +252,34920.5 +253,39152.4791666667 +254,38541.5208333333 +255,32278.3333333333 +256,31430.25 +257,35415.8958333333 +258,33463.625 +259,33851.8541666667 +260,30976.3958333333 +261,31574.625 +262,29349.7083333333 +263,30024.2708333333 +264,35590.5 +265,33563.1666666667 +266,33006.1458333333 +267,31380.0833333333 +268,31721.2291666667 +269,28989.1666666667 +270,27466.1666666667 +271,25624.9791666667 +272,29054.9583333333 +273,31420 +274,33059.3333333333 +275,31627.1458333333 +276,28827.3541666667 +277,27355.0208333333 +278,32402.3125 +279,34007.375 +280,34461.8333333333 +281,35336.5416666667 +282,36574.3958333333 +283,32460.0416666667 +284,31221.8541666667 +285,36595.75 +286,36450.0208333333 +287,36419.9583333333 +288,37283.6041666667 +289,37796.0625 +290,33925.9375 +291,30623.2291666667 +292,37481.2916666667 +293,37741.9583333333 +294,39801.875 +295,36788.5 +296,36692.125 +297,32177.1458333333 +298,30233.2708333333 +299,34876.625 +300,37327.9791666667 +301,38319.3333333333 +302,39201.4166666667 +303,35897.0833333333 +304,27388.125 +305,28612.6666666667 +306,33926.3333333333 +307,36528.3333333333 +308,33258.3333333333 +309,39291.2708333333 +310,37087.0833333333 +311,34048.9583333333 +312,32975.125 +313,39534.4375 +314,39823.2916666667 +315,38404.1458333333 +316,38064.3125 +317,30055.2083333333 +318,29113.7708333333 +319,29596.6041666667 +320,37315.125 +321,40023.2291666667 +322,37824.0833333333 +323,39791.7083333333 +324,37546.5833333333 +325,31181.7708333333 +326,27359.0833333333 +327,34509.0416666667 +328,34809.3333333333 +329,36160.7291666667 +330,32004.6041666667 +331,35182.3125 +332,30322.1666666667 +333,26749.5833333333 +334,26780.7083333333 +335,28270.1041666667 +336,24252.6875 +337,28454.8125 +338,32193.1041666667 +339,24372.25 +340,20305.2291666667 +341,30990 +342,32384.1041666667 +343,33452.8541666667 +344,34031.5833333333 +345,34688.4791666667 +346,31378.75 +347,30240.2083333333 +348,32059.1458333333 +349,32222.7291666667 +350,34901.0208333333 +351,35452.1041666667 +352,35971.2708333333 +353,33145.3333333333 +354,32811.625 +355,38172.6666666667 +356,40129.4166666667 +357,40813.9583333333 +358,38579.875 +359,37863.6666666667 +360,33448.8333333333 +361,29783.8541666667 +362,34660.0625 +363,37094.6458333333 +364,35711.75 +365,35905.2083333333 +366,35828.7916666667 +367,33670.9166666667 +368,29721 +369,33744.1041666667 +370,37893.5833333333 +371,39821.9791666667 +372,40011.0208333333 +373,40511.1458333333 +374,35121.7083333333 +375,32450.8541666667 +376,39577.7291666667 +377,41002.3958333333 +378,40349.1458333333 +379,39672.5208333333 +380,37276.8333333333 +381,33559.7916666667 +382,31932 +383,32710.5416666667 +384,34080.2291666667 +385,33123.4166666667 +386,35759.8333333333 +387,33062.5416666667 +388,32275.3333333333 +389,29755.7708333333 +390,37062.3333333333 +391,38360.7708333333 +392,37836.5 +393,37951 +394,34614.125 +395,34625.4375 diff --git a/Data/submission_rl.csv b/Data/submission_rl.csv new file mode 100644 index 0000000..c55cde7 --- /dev/null +++ b/Data/submission_rl.csv @@ -0,0 +1,396 @@ +Id,Net_demand +1,41009.1147964254 +2,34473.360511116 +3,30772.4981282842 +4,38091.0665670246 +5,39822.9591462033 +6,40777.6018003183 +7,38953.0136001664 +8,35813.1224691621 +9,32233.3346475244 +10,31766.3840129431 +11,37898.9637432462 +12,38154.3588767859 +13,39774.3985007542 +14,40526.8802286998 +15,39808.8633414797 +16,34546.6325807249 +17,32008.2824827369 +18,39793.4978808967 +19,40997.6380379983 +20,41218.7564579596 +21,41909.4769271616 +22,41309.5412182102 +23,35327.2505322527 +24,33373.5374659217 +25,38328.5263302712 +26,37239.7544088553 +27,39159.6219090342 +28,43298.6235008901 +29,41092.8238133846 +30,31165.5213350442 +31,30858.1546724317 +32,42012.0537487998 +33,42902.5200123049 +34,38728.9840764691 +35,41191.3581118805 +36,41272.398386766 +37,36263.8954014391 +38,34178.4893201939 +39,40521.7277185981 +40,42274.6734981992 +41,42616.9040260493 +42,41859.8306817765 +43,38994.7630564299 +44,32224.7130433929 +45,30095.2543484697 +46,38529.3313996793 +47,38888.9852403129 +48,37565.4040127878 +49,36985.5357184463 +50,36059.2876005895 +51,32299.5527853066 +52,27926.1828308822 +53,34325.6682800736 +54,37943.9412185285 +55,37634.1725891997 +56,36442.8233034287 +57,35938.9426471888 +58,31484.0102112068 +59,31825.7692058702 +60,35823.2718835444 +61,30118.1917343074 +62,35000.0504377355 +63,39452.138470712 +64,41351.2915248244 +65,40083.8611559023 +66,37187.58804325 +67,42112.9328649877 +68,40616.5838285329 +69,42890.5485768071 +70,45005.3331172866 +71,39702.8813436882 +72,37432.9016956614 +73,39522.6403883177 +74,46252.3195593948 +75,44961.0549941887 +76,43208.4793574541 +77,41951.5830371309 +78,45668.7862292237 +79,44234.9740710975 +80,42067.69314191 +81,48504.0783655452 +82,49046.4701108324 +83,48549.2384872243 +84,49068.1045944626 +85,50547.0925349755 +86,46034.8550494611 +87,44347.6529777403 +88,52432.5147051949 +89,55609.0607941641 +90,56625.6071628036 +91,57153.7325266272 +92,57805.4602328986 +93,52110.8267405492 +94,51978.4022398683 +95,61960.6345629937 +96,63477.1521380037 +97,63119.9602197014 +98,63789.7536146523 +99,64279.0390879097 +100,59153.2419218139 +101,59544.1237259818 +102,68545.3728433131 +103,69775.4455276996 +104,67283.494805851 +105,64346.2103840811 +106,65104.6202340397 +107,62940.1917203197 +108,59506.668955241 +109,59821.5617488393 +110,52958.5132777863 +111,50064.8933059598 +112,46211.1939151869 +113,43430.1173365619 +114,39202.2358392553 +115,37730.7694556551 +116,45150.7630512708 +117,46753.3589706313 +118,44237.8731521708 +119,43314.5468066071 +120,40577.5555919112 +121,32203.7167169227 +122,33199.8978095377 +123,45322.5066259605 +124,47918.0738989262 +125,46685.9100105333 +126,48081.233311145 +127,48528.1574472573 +128,41824.2861873607 +129,40175.4991399666 +130,47362.9392851221 +131,51328.1679227418 +132,50347.6024730265 +133,46750.0862085905 +134,46909.7511546301 +135,41555.1263811076 +136,41169.3406922623 +137,48997.433588352 +138,59964.401010899 +139,63283.7910565977 +140,65785.2899182616 +141,65039.6942117576 +142,59654.3054008385 +143,58651.301992492 +144,67410.0275101818 +145,67924.9937744132 +146,68877.2292927781 +147,67762.329887337 +148,65097.6260066326 +149,59745.7584650382 +150,60077.6965724322 +151,65068.4399727135 +152,64029.9148768759 +153,58385.5221793767 +154,56230.559684541 +155,56021.881272036 +156,51841.7710662783 +157,48694.2554109569 +158,56566.584308465 +159,59857.8726976483 +160,63033.2805348151 +161,66243.789407006 +162,66045.2504337911 +163,58461.5544939133 +164,54099.7600679681 +165,60387.3028167605 +166,60624.7955189418 +167,58881.547214649 +168,55705.3572398968 +169,49597.2480155272 +170,42041.5361583266 +171,42228.4198133277 +172,51364.676303803 +173,54683.6612445613 +174,54049.7537951268 +175,53215.9445903898 +176,52770.9446840817 +177,46827.6360288863 +178,44261.6366447881 +179,53701.9801910715 +180,59916.2238309035 +181,61299.6238197057 +182,60765.147955156 +183,59661.773790294 +184,53144.9423071041 +185,52485.2016036308 +186,58483.8421698605 +187,57086.6806682637 +188,49429.6904631056 +189,44705.7879530968 +190,40822.935053429 +191,43530.355329243 +192,39742.1350784323 +193,39881.2478907409 +194,40466.6422605643 +195,48220.4341800799 +196,47199.4765479217 +197,43841.2926867653 +198,38421.8777720739 +199,37318.5383792517 +200,47069.8262511588 +201,46854.1209793506 +202,42024.8470137332 +203,38569.7351239098 +204,36410.8740643212 +205,31764.8304684832 +206,32950.1205261362 +207,45184.0379620644 +208,47905.1124749504 +209,45129.4281009432 +210,38999.9527207404 +211,31834.929242378 +212,30810.0838520697 +213,33978.2544051791 +214,45259.8014840161 +215,48379.8698679431 +216,50260.3783532209 +217,48348.2046522618 +218,45931.6981780299 +219,40473.1877954559 +220,37221.4421157311 +221,35163.3008013467 +222,35916.6361607649 +223,38050.223701779 +224,40741.9136469765 +225,42572.0631886317 +226,37855.7728361356 +227,37768.9854860579 +228,44070.1696516798 +229,42148.8472073104 +230,39663.1320395556 +231,41036.5811221689 +232,41590.6821828004 +233,36293.9763360914 +234,31761.3895226917 +235,39693.4703479048 +236,43183.2052359478 +237,44031.8923112052 +238,41915.9953284779 +239,37815.1941604557 +240,33887.554066798 +241,31585.4999606433 +242,33948.1569840597 +243,35289.2362296705 +244,37065.2562872105 +245,36878.8784921901 +246,37957.7215809222 +247,33648.8479836315 +248,31667.1413794066 +249,32767.7655890571 +250,34710.5446980759 +251,36911.7198399054 +252,39591.2579478584 +253,39434.6245861148 +254,33199.9294152307 +255,31511.6349104792 +256,38631.9207010689 +257,38308.4810626709 +258,37011.778959444 +259,31860.4004486154 +260,32766.0269211394 +261,27742.174621023 +262,28516.1584595691 +263,36620.7950546094 +264,35978.8700789118 +265,36111.4769708328 +266,34661.6397016195 +267,32876.65562223 +268,28813.2493114023 +269,26138.472986281 +270,25496.1739486545 +271,28245.398739396 +272,30878.4517026694 +273,34510.9456552169 +274,35150.3265312857 +275,29502.0185520577 +276,28255.0389732435 +277,35880.9192237336 +278,36038.4239731951 +279,35268.5524285719 +280,35723.6448737719 +281,36295.6119479537 +282,31691.4885376913 +283,30556.2021622242 +284,38322.8387910467 +285,37616.5157172166 +286,36954.5917777308 +287,38007.9220681088 +288,38360.2040179043 +289,33330.0689612379 +290,31475.69084605 +291,38018.4975264289 +292,37826.7689588888 +293,38777.6938327234 +294,38724.1083598402 +295,37151.7752403211 +296,31831.5084704328 +297,29100.2195094858 +298,37755.9862408944 +299,39575.5785587875 +300,38991.0899416821 +301,39181.3780855865 +302,38298.5420887693 +303,30035.8184971488 +304,27935.0572293674 +305,36104.3256541382 +306,38112.9310634203 +307,37643.0277394262 +308,38849.1931822073 +309,37451.8333051375 +310,32414.4600326794 +311,32635.2038166646 +312,39637.7665801139 +313,40066.9470657462 +314,41035.4099499937 +315,39916.6775424344 +316,30465.2085694282 +317,26806.1768932007 +318,29999.1294212109 +319,38136.152875612 +320,39600.8879755685 +321,39362.7589851691 +322,40954.2777574393 +323,39655.875962614 +324,32997.0072592993 +325,29038.522829611 +326,36956.8123380639 +327,38533.7910638983 +328,37084.0265166117 +329,35232.2602948273 +330,34401.7042704498 +331,29760.7680392709 +332,27691.7094344626 +333,33727.6999649431 +334,31010.0004420948 +335,27938.1922548886 +336,31123.9232900223 +337,33531.3724136805 +338,27305.6710754604 +339,24002.0535529001 +340,34388.4274119979 +341,33929.2722417571 +342,33541.6889660646 +343,33642.4138106099 +344,34003.3853564986 +345,29110.7289383778 +346,29584.1902068401 +347,34961.9388241791 +348,28809.1093448056 +349,32761.1110322545 +350,34051.1332880176 +351,34114.1964651511 +352,30018.0112479118 +353,30816.6897230645 +354,38694.5700287606 +355,38645.1571472702 +356,39069.3994281793 +357,39095.4733172297 +358,38986.8486691881 +359,35439.8380677738 +360,31786.4039541131 +361,37634.9271974545 +362,38148.3961004604 +363,37092.7458277253 +364,36391.5460699999 +365,35067.6070131377 +366,31466.6975771675 +367,28359.7653164271 +368,34776.3913147408 +369,36914.4655424811 +370,39159.0614733987 +371,39874.1130270668 +372,39316.7349644272 +373,34157.6239402064 +374,31875.4373967677 +375,40220.3461054174 +376,41397.4307605493 +377,40688.5235141067 +378,40796.0615570258 +379,38027.4990851946 +380,32157.3715784887 +381,29392.8502784683 +382,36101.5919010045 +383,36307.2451982706 +384,34950.0942345186 +385,37647.8710182449 +386,37242.6132701221 +387,32721.610806948 +388,30082.9419075393 +389,38600.859295291 +390,38806.1251962196 +391,37340.3880179299 +392,37472.915005426 +393,35895.1986072332 +394,33263.0630101073 +395,37519.3167159439 diff --git a/README.md b/README.md index 6925ea8..e2845be 100644 --- a/README.md +++ b/README.md @@ -1 +1,58 @@ -# Net-Load_Forecasting \ No newline at end of file +# Prédiction de la Demande Nette en Énergie Électrique + +## Auteurs +- Félix OLLIVIER +- Lylian CHALLIER + +## Date +10 mars 2025 + +## Résumé du Projet +Ce projet vise à prédire la demande nette en énergie électrique (`Net_demand`) en France en utilisant diverses approches de modélisation prédictive. L'objectif est de déterminer avec précision la consommation nette d'énergie à partir de données historiques couvrant la période jusqu'à fin 2021. + +## Méthodologie + +### Prétraitement des Données +- Conversion des variables catégorielles en facteurs +- Séparation des données en ensembles d'entraînement et d'évaluation + +### Analyse Exploratoire des Données +- **Analyse unidimensionnelle** : Identification d'une forte saisonnalité annuelle dans la demande énergétique et observation de la relation entre la consommation totale (`Load`) et la somme de la demande nette et des énergies renouvelables +- **Analyse bidimensionnelle** : Étude des corrélations entre la demande nette et diverses variables catégorielles (jours fériés, vacances d'été) et continues (température, vent, nébulosité) + +### Sélection des Variables +- **Corrélation linéaire** : Identification des variables ayant une corrélation significative (>0.3) avec la variable cible +- **Régression linéaire** : Comparaison de différentes stratégies de sélection (modèle complet, modèle réduit, sélection backward) + +### Modélisation +- **Modèle GAM (Generalized Additive Model)** : Modélisation des relations non linéaires et cycliques +- **Modèles Random Forest** : Différentes approches de sélection de variables (complet, backward, mixte) + +### Évaluation des Modèles +- **Métriques d'évaluation** : RMSE (Root Mean Square Error), MAPE (Mean Absolute Percentage Error), Pinball Loss +- **Comparaison des performances** : Tableau comparatif des différents modèles + +## Résultats Principaux +- Identification de variables clés influençant la demande nette d'énergie (température, jours fériés, périodes de vacances) +- Le modèle GAM a montré de bonnes performances dans la capture des relations non linéaires +- Les modèles Random Forest ont également montré des résultats prometteurs + +## Structure des Fichiers +- `rapport.Rmd` : Document principal contenant l'analyse complète et le code R +- `R/score.R` : Script contenant les fonctions d'évaluation des modèles +- `Data/train.csv` : Données d'entraînement +- `Data/test.csv` : Données de test pour la prédiction + +## Dépendances +- Bibliothèques R requises : mgcv, corrplot, gt, tidyverse, ranger, randomForest, xgboost, yarrr + +## Utilisation +Pour reproduire l'analyse, exécutez le code dans le fichier rapport.Rmd. Assurez-vous d'avoir installé toutes les dépendances nécessaires. + +```r +# Installation des packages requis +install.packages(c("mgcv", "corrplot", "gt", "tidyverse", "ranger", "randomForest", "xgboost", "yarrr")) + +# Exécution du rapport +rmarkdown::render("rapport.Rmd") +``` diff --git a/analyse_explo.r b/analyse_explo.r index 59a4810..4882478 100644 --- a/analyse_explo.r +++ b/analyse_explo.r @@ -21,28 +21,26 @@ col <- yarrr::piratepal("basel") # couleur des graphiques ### Import et Prepro ### ######################### # Load the data -train <- read_csv('Data/train.csv') # for training and evaluating -test <- read_csv('Data/test.csv') # to make prediction +Data0 <- read_csv('Data/train.csv') # for training and evaluating +Data1 <- read_csv('Data/test.csv') # to make prediction # Preprocess the data -Data0 <- train Data0$Time <- as.numeric(Data0$Date) -Data1 <- test Data1$Time <- as.numeric(Data1$Date) # Convert categorical variables to factors discret = c("WeekDays", "BH_before", "BH", "BH_after", "DLS","Summer_break", "Christmas_break", "Holiday", "Holiday_zone_a", "Holiday_zone_b", - "Holiday_zone_c", "BH_Holiday") + "Holiday_zone_c", "BH_Holiday", "Month") Data0[, discret] <- lapply(Data0[, discret], as.factor) Data1[, discret] <- lapply(Data1[, discret], as.factor) - -str(Data0) +# enleve les variables que l'on a pas dans Data1 : Load, Solar_power, Wind_power +Data0 = Data0[-c(2, 6, 7)] # Split Data0 into train/eval dataset -sel_a = which(Data0$Year<=2021) # training index -sel_b = which(Data0$Year>2021) # eval index +sel_a = which(Data0$Year<=2019) # training index +sel_b = which(Data0$Year>2019) # eval index ######################### @@ -56,15 +54,15 @@ plot(Data0$Date, Data0$Net_demand, type='l', xlim=range(Data0$Date, Data1$Date), # plot variables sur temps : Load, Net_demand, Solar, Wind par(mfrow=c(2,2)) -plot(Data0$Date, Data0$Load, type='l', col=col[1], main="Load dans le temps") -plot(Data0$Date, Data0$Net_demand, type='l', col=col[2], main="Net_demand dans le temps") -plot(Data0$Date, Data0$Solar_power, type='l', col=col[3], main="Solar_power dans le temps") -plot(Data0$Date, Data0$Wind_power, type='l', col=col[4], main="Wind_power dans le temps") +plot(Data0$Date, Data0$Load.1, type='l', col=col[1], main="Load dans le temps") +plot(Data0$Date, Data0$Net_demand.1, type='l', col=col[2], main="Net_demand dans le temps") +plot(Data0$Date, Data0$Solar_power.1, type='l', col=col[3], main="Solar_power dans le temps") +plot(Data0$Date, Data0$Wind_power.1, type='l', col=col[4], main="Wind_power dans le temps") # Load = Net_demand + Solar + Wind par(mfrow=c(2,1)) -plot(Data0$Date, Data0$Load, type='l', col=col[1], main="Load dans le temps") -plot(Data0$Date, Data0$Net_demand+Data0$Solar_power+Data0$Wind_power, type='l', col=col[2], main="Net_demand + Solar_power + Wind_power") +plot(Data0$Date, Data0$Load.1, type='l', col=col[1], main="Load dans le temps") +plot(Data0$Date, Data0$Net_demand.1+Data0$Solar_power.1+Data0$Wind_power.1, type='l', col=col[2], main="Net_demand + Solar_power + Wind_power") # plot variables sur temps : net_demand, toy, Temp par(mfrow=c(3,1)) @@ -108,6 +106,14 @@ plot(Data0$Net_demand ~ Data0$Nebulosity_weighted, col=col[3], main="Net_demand plot(Data0$Net_demand ~ Data0$Temp_s95, col=col[4], main="Net_demand selon Temp_s95") +par(mfrow=c(2, 2)) # mettre month en discret ? suit pas mal le toy +#plot(Data0$Net_demand ~ Data0$Month, col=col[1], main="Net_demand selon Month") +plot(Data0$Net_demand ~ Data0$toy, col=col[1], main="Net_demand selon toy (time of year)") +plot(Data0$Net_demand ~ Data0$Wind, col=col[2], main="Net_demand selon Wind") +plot(Data0$Net_demand ~ Data0$Nebulosity, col=col[3], main="Net_demand selon Nebulosity") +plot(Data0$Net_demand ~ Data0$Temp, col=col[4], main="Net_demand selon Temp") + + ################### ### Conclusion ### ################### @@ -147,5 +153,5 @@ plot(Data0$Net_demand ~ Data0$Temp_s95, col=col[4], main="Net_demand selon Temp_ # Clairement lié à la température, la saison # et les vacances => plus bas vers le summer_break # retrouve le même effet mais en discret pour month -# faut-il le passer en factor ? +# faut-il le passer en factor ? oui le faire diff --git a/modelisation.R b/modelisation.R index 17b867f..f747ec3 100644 --- a/modelisation.R +++ b/modelisation.R @@ -2,12 +2,18 @@ rm(list=objects()) graphics.off() # Load necessary libraries library(mgcv) +library(corrplot) library(gt) library(tidyverse) library(ranger) library(randomForest) library(xgboost) +library(yarrr) source('R/score.R') +# Options graphique +options(vsc.dev.args = list(width=1200, height=800, pointsize=10, res=96)) +par(mar = c(5, 5, 5, 5)) # marges : bas, gauche, haut, droite +col <- yarrr::piratepal("basel") # couleur des graphiques ######################### @@ -24,12 +30,102 @@ Data1 <- test Data1$Time <- as.numeric(Data1$Date) # Convert categorical variables to factors -Data0$WeekDays <- as.factor(Data0$WeekDays) -Data1$WeekDays <- as.factor(Data1$WeekDays) +discret = c("WeekDays", "BH_before", "BH", "BH_after", + "DLS","Summer_break", "Christmas_break", + "Holiday", "Holiday_zone_a", "Holiday_zone_b", + "Holiday_zone_c", "BH_Holiday", "Month") +Data0[, discret] <- lapply(Data0[, discret], as.factor) +Data1[, discret] <- lapply(Data1[, discret], as.factor) # Split Data0 into train/eval dataset -sel_a <- which(Data0$Year<=2021) # training index -sel_b <- which(Data0$Year>2021) # eval index +sel_a <- which(Data0$Year<=2019) # training index +sel_b <- which(Data0$Year>2019) # eval index + +length(sel_b) +dim(Data0) + +975/3471 + +Data0$Date +Data1$Date +# Drop covariables that are not in test dataset : Load, Solar_power, Wind_power +Data0 = Data0[-c(2, 6, 7)] + +########### +### RL ### +########### + +# Define the equation for rl1 = rf backward // avec l'equation rf2 encore mieux +rl1_equation = Net_demand ~ Load.1 + Temp + Temp_s95_max + Temp_s99_min + Temp_s99_max + + Wind + Wind_weighted + Nebulosity_weighted + toy + WeekDays + + BH_before + BH + Year + Month + Christmas_break + BH_Holiday + + Wind_power.1 + Net_demand.7 + Time + Summer_break + +rf2_equation = Net_demand ~ Load.1 + Temp + Temp_s95_max + Temp_s99_min + Temp_s99_max + + Wind + Wind_weighted + Nebulosity_weighted + toy + WeekDays + + BH_before + BH + Year + Month + Christmas_break + BH_Holiday + + Wind_power.1 + Net_demand.7 + Time + Net_demand.1 + Temp_s99 + Temp_s95 + + Load.7 + Temp_s95_min + Summer_break + +# Train rf on train set +rl1 = lm(rf2_equation, data=Data0[sel_a,]) + +# Evaluation +rl1_pred = predict(rl1, newdata= Data0[sel_b,]) +rl1_rmse = rmse.old(Data0$Net_demand[sel_b]-rl1_pred) +rl1_mape = mape(Data0$Net_demand[sel_b], rl1_pred) +rl1_pinball = pinball_loss2(Data0$Net_demand[sel_b]-rl1_pred, 0.8) + +par(mfrow=c(2,1)) +plot(Data0$Date[sel_b], rl1_pred, type='l', col=col[1], main="Prediction et valeur réelle sur l'évalutaion pour RF mixte") +lines(Data0$Date[sel_b], Data0$Net_demand[sel_b], type='l', col=col[2]) +plot(Data0$Date[sel_b], Data0$Net_demand[sel_b]-rl1_pred, type='l', col=col[3], main="Résidus") # residus + + +########### +### RF ### +########### + +# Define the equation for rf1 = rf complet +rf1_equation = Net_demand ~ . + +# Train rf on train set +rf1 = ranger(rf1_equation, data=Data0[sel_a,], num.trees = 1000, sample.fraction = 0.1, importance="permutation") + +# Evaluation +rf1_pred = predict(rf1, data= Data0[sel_b,])$predictions +rf1_rmse = rmse.old(Data0$Net_demand[sel_b]-rf1_pred) +rf1_mape = mape(Data0$Net_demand[sel_b], rf1_pred) +rf1_pinball = pinball_loss2(Data0$Net_demand[sel_b]-rf1_pred, 0.8) + +par(mfrow=c(2,1)) +plot(Data0$Date[sel_b], rf1_pred, type='l', col=col[1], main="Prediction et valeur réelle sur l'évalutaion pour RF complet") +lines(Data0$Date[sel_b], Data0$Net_demand[sel_b], type='l', col=col[2]) +plot(Data0$Date[sel_b], Data0$Net_demand[sel_b]-rf1_pred, type='l', col=col[3], main="Résidus") # residus + + + +# Define the equation for rf2 = rf mixte +rf2_equation = Net_demand ~ Load.1 + Temp + Temp_s95_max + Temp_s99_min + Temp_s99_max + + Wind + Wind_weighted + Nebulosity_weighted + toy + WeekDays + + BH_before + BH + Year + Month + Christmas_break + BH_Holiday + + Wind_power.1 + Net_demand.7 + Time + Net_demand.1 + Temp_s99 + Temp_s95 + + Load.7 + Temp_s95_min + Summer_break + +# Train rf on train set +rf2 = ranger(rf2_equation, data=Data0[sel_a,], num.trees = 1000, sample.fraction = 0.1, importance="permutation") + +# Evaluation +rf2_pred = predict(rf2, data= Data0[sel_b,])$predictions +rf2_rmse = rmse.old(Data0$Net_demand[sel_b]-rf2_pred) +rf2_mape = mape(Data0$Net_demand[sel_b], rf2_pred) +rf2_pinball = pinball_loss2(Data0$Net_demand[sel_b]-rf2_pred, 0.8) + +par(mfrow=c(2,1)) +plot(Data0$Date[sel_b], rf2_pred, type='l', col=col[1], main="Prediction et valeur réelle sur l'évalutaion pour RF mixte") +lines(Data0$Date[sel_b], Data0$Net_demand[sel_b], type='l', col=col[2]) +plot(Data0$Date[sel_b], Data0$Net_demand[sel_b]-rf2_pred, type='l', col=col[3], main="Résidus") # residus + ############ ### GAM ### @@ -50,36 +146,80 @@ gam_equation <- Net_demand ~ te(Temp_s95_min, Temp_s99_min) + s(Wind, bs = 'cr') + ti(Nebulosity_weighted) + - ti(Wind_weighted, Temp, bs = 'ts') + ti(Wind_weighted, Temp, bs = 'ts') + + s(Net_demand.1, bs = 'cr') + + s(Net_demand.7, bs = 'cr') # Train the GAM model with shrinkage on training set gam_model <- gam(gam_equation, data = Data0[sel_a,], select = TRUE, gamma = 1.5) # Evaluation -eval_pred = predict(gam_model, newdata= Data0[sel_b,]) -gam1_rmse = rmse.old(Data0$Net_demand[sel_b]-eval_pred) -gam1_mape = mape(Data0$Net_demand[sel_b], eval_pred) -gam1_pinball = pinball_loss2(Data0$Net_demand[sel_b]-eval_pred, 0.8) +gam1_pred = predict(gam_model, newdata= Data0[sel_b,]) +gam1_rmse = rmse.old(Data0$Net_demand[sel_b]-gam1_pred) +gam1_mape = mape(Data0$Net_demand[sel_b], gam1_pred) +gam1_pinball = pinball_loss2(Data0$Net_demand[sel_b]-gam1_pred, 0.8) +par(mfrow=c(2,1)) +plot(Data0$Date[sel_b], gam1_pred, type='l', col=col[1], main="Prediction et valeur réelle sur l'évalutaion pour GAM") +lines(Data0$Date[sel_b], Data0$Net_demand[sel_b], type='l', col=col[2]) +plot(Data0$Date[sel_b], Data0$Net_demand[sel_b]-gam1_pred, type='l', col=col[3], main="Résidus") # residus -########### -### RF ### -########### -# Define the equation for rf -rf_equation <- Net_demand ~ Time + toy + Temp + Temp_s99 + Load.1 + Load.7 + - WeekDays + BH + Temp_s95_max * Temp_s99_max + - Summer_break + Christmas_break + Temp_s95_min * Temp_s99_min + - Wind + Nebulosity_weighted + Wind_weighted * Temp +# Define the equation for the GAM 2 model +gamm_equation <- Net_demand ~ + s(Load.1, k = 3, bs = 'cc') + + s(Load.7, k = 3, bs = 'cc') + + s(Net_demand.1, k=3, bs='cc') + + s(Net_demand.7, k=3, bs='cc') + + s(Temp, k=3, bs='cr') + + te(Temp_s95_max, Temp_s95_min) + + te(Temp_s99_max, Temp_s99_min) + + ti(Temp_s99, k = 1, bs = 'cr') + + ti(Temp_s95, k = 1, bs = 'cr') + + WeekDays + BH + BH_before + Month + + Christmas_break + Summer_break + + BH_Holiday + + +gam2_equation <- Net_demand ~ + s(Time, k = 5, bs = 'cr') + # Augmenter k pour plus de flexibilité + s(toy, k = 20, bs = 'cc') + # Réduire k si nécessaire + ti(Temp, k = 8, bs = 'cr') + # Ajuster k + ti(Temp_s99, k = 8, bs = 'cr') + # Ajuster k + s(Net_demand.1, bs = 'cr') + + s(Net_demand.7, bs = 'cr') + + ti(Temp_s99, Temp, bs = c('cr', 'cr'), k = c(8, 8)) + # Ajuster k + as.factor(WeekDays) + BH + + te(Temp_s95_max, Temp_s99_max, k = c(5, 5)) + # Ajouter k pour plus de flexibilité + Summer_break + Christmas_break + + te(Temp_s95_min, Temp_s99_min, k = c(5, 5)) + # Ajouter k pour plus de flexibilité + s(Wind, bs = 'cr') + + ti(Nebulosity_weighted, bs = 'cr') + # Changer la base de lissage si nécessaire + ti(Wind_weighted, Temp, bs = 'ts') -# Train rf on train set -rf_model = randomForest(rf_equation, data=Data0[sel_a,]) + +# Train the GAM model with shrinkage on training set +gam2_model <- gam(gam2_equation, data = Data0[sel_a,], select = TRUE, gamma = 1.5) # Evaluation -eval_pred = predict(rf_model, newdata= Data0[sel_b,]) -rf1_rmse = rmse.old(Data0$Net_demand[sel_b]-eval_pred) -rf1_mape = mape(Data0$Net_demand[sel_b], eval_pred) -rf1_pinball = pinball_loss2(Data0$Net_demand[sel_b]-eval_pred, 0.8) +gam2_pred = predict(gam2_model, newdata= Data0) +gam2_rmse = rmse.old(Data0$Net_demand-gam2_pred) +gam2_mape = mape(Data0$Net_demand, gam2_pred) +gam2_pinball = pinball_loss2(Data0$Net_demand-gam2_pred, 0.8) +gam2_pinball + +par(mfrow=c(2,1)) +plot(Data0$Date[sel_b], gam2_pred, type='l', col=col[1], main="Prediction et valeur réelle sur l'évalutaion pour GAM") +lines(Data0$Date[sel_b], Data0$Net_demand[sel_b], type='l', col=col[2]) +plot(Data0$Date[sel_b], Data0$Net_demand[sel_b]-gam2_pred, type='l', col=col[3], main="Résidus") # residus + + +res <- Data0$Net_demand[sel_a] - gam2_pred[sel_a] +hist(res, breaks=100) +mean(res) +sd(res) +quant <- qnorm(0.8, mean= mean(res), sd= sd(res)) +pinball_loss(y=Data0$Net_demand[sel_b], rf_gam.forecast[sel_b]+quant, quant=0.8, output.vect=FALSE) ################### @@ -88,10 +228,10 @@ rf1_pinball = pinball_loss2(Data0$Net_demand[sel_b]-eval_pred, 0.8) # Créer un DataFrame avec les noms des modèles et leurs pertes model_losses = data.frame( - Modèle = c("GAM 1", "RF 1"), - RMSE = c(gam1_rmse, rf1_rmse), - MAPE = c(gam1_mape, rf1_mape), - Pinball = c(gam1_pinball, rf1_pinball) + Modèle = c("RL 1", "RF 1", "RF 2", "GAM 1", "GAM 2"), + RMSE = c(rl1_rmse, rf1_rmse, rf2_rmse, gam1_rmse, gam2_rmse), + MAPE = c( rl1_mape, rf1_mape, rf2_mape, gam1_mape, gam2_mape), + Pinball = round(c(rl1_pinball, rf1_pinball, rf2_pinball, gam1_pinball, gam2_pinball), digits=0) ) # Afficher le tableau @@ -102,8 +242,18 @@ gt(model_losses) %>% tab_style( style = cell_text(weight = "bold"), locations = cells_body( - columns = vars(Pinball), - rows = Pinball < 700)) + columns = c(Pinball), + rows = Pinball < 650)) %>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(MAPE), + rows = MAPE < 2.5)) %>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(RMSE), + rows = RMSE < 1400)) ########################### @@ -111,18 +261,32 @@ gt(model_losses) %>% ########################### # Train our model on all the train dataset -gam_model = gam(gam_equation, data = Data0, select = TRUE, gamma = 1.5) -rf_model = randomForest(rf_equation, data=Data0) +gam_model = gam(gam2_equation, data = Data0, select = TRUE, gamma = 1.5) +rf_model = ranger(rf2_equation, data=Data0, num.trees = 1000, sample.fraction = 0.1, importance="permutation") +rl_model = lm(rf2_equation, data=Data0) # Make predictions on the test data gam_forecast = predict(gam_model, newdata = Data1) -#rf_forecast = predict(rf_model, data=Data1) +gam_forecastpast = predict(gam_model, newdata = Data0) +rf_forecast = predict(rf_model, data=Data1)$predictions +rl_forecast = predict(rl_model, newdata=Data1) # Load the sample submission file submit = read_delim(file = "Data/sample_submission.csv", delim = ",") # Assign the forecasted values to the submission file -submit$Net_demand = gam_forecast +res <- Data0$Net_demand - gam_forecastpast +hist(res, breaks=100) +mean(res) +sd(res) +quant <- qnorm(0.7, mean= mean(res), sd= sd(res)) +quant +submit$Net_demand = gam_forecast-quant # Write the submission file to CSV -write.table(submit, file = "Data/submission_rf.csv", quote = FALSE, sep = ",", dec = '.', row.names = FALSE) +write.table(submit, file = "Data/submission_gam.csv", quote = FALSE, sep = ",", dec = '.', row.names = FALSE) + + + +gam_forecast +submit$Net_demand diff --git a/rapport.Rmd b/rapport.Rmd index 33ab09a..041b837 100644 --- a/rapport.Rmd +++ b/rapport.Rmd @@ -1,127 +1,577 @@ ------------------------------------------------------------------------- +--- +title: "Net Demand Forcasting" +subtitle: "Projet de Modélisation Prédictive encadré par Yannig Goude" +author: "Lylian Challier et Félix Ollivier" +date: "2025-03-10" +output: pdf_document +--- -## Prévision Adaptative de la Demande Électrique en France par GAM avancé +\thispagestyle{empty} -Félix OLLIVIER - Lylian CHALLIER +\mbox{} -10-03-2025 +\newpage -## Introduction +\thispagestyle{empty} -L'objectif principal de ce projet est de concevoir un modèle adaptatif capable de prévoir précisément la demande électrique nette en France. Une telle approche est essentielle pour permettre aux gestionnaires du réseau électrique d’optimiser leurs coûts opérationnels, notamment dans un contexte marqué par l'intégration accrue de sources renouvelables intermittentes comme le solaire et l'éolien. La variabilité inhérente à ces sources rend nécessaire une prévision fine et robuste afin d'assurer un équilibre optimal entre l'offre et la demande d'électricité. +\tableofcontents{} -## Description détaillée des données +\newpage -Les données exploitées dans ce projet proviennent de mesures de consommation et de facteurs environnementaux couvrant la période de janvier 2012 à septembre 2022. Pour réaliser une évaluation réaliste et rigoureuse du modèle proposé, le jeu de données initial (`Data0`) a été segmenté en deux ensembles distincts : un ensemble d'entraînement (`sel_a`) regroupant les données historiques jusqu'à la fin de l'année 2021, et un ensemble de validation (`sel_b`) comprenant l'ensemble des observations enregistrées durant l'année 2022. Cette méthode garantit une évaluation temporellement cohérente et représentative des performances réelles du modèle. +\pagenumbering{arabic} -``` r +\setcounter{page}{1} + +# Introduction + +Dans ce projet, nous allons nous intéresser à la prédiction de la demande nette en énergie électrique `Net_demand` en France de septembre 2022 à octobre 2023. Pour cela nous avons à notre disposition des données sur la période de mars 2013 à septembre 2022, que nous avons découpé en ensemble d’entraînement et d’évaluation au niveau de l’année 2019 (72% train, 28% eval). + +Avec ce découpage nous avons évalué nos modèles sur l’ensemble d’évaluation pour avoir des estimateurs sans biais de nos critères de sélection. Bien que la soumission soit évaluée sur une Pinball Loss quantile 0.8, nous avons aussi regardé le RMSE et le MAPE. Une fois l’évaluation des modèles effectuée, nous avons entrainé le modèle le plus convaincant sur les données de 2013 à 2022 sans le découpage pour faire nos prédictions. + +Avant de présenter les données à notre disposition, il faut savoir que la demande nette correspond à la différence entre la charge d’électricité et les productions solaire et éolienne. Aussi, on considère la France métropolitaine dans son entièreté, les données sont donc des moyennes et moyennes pondérées sur la France. Voici un petit résumé des données que nous avons : + +- La demande nette électrique du jour précédent et de la semaine précédente + +- La production solaire du jour précédent et de la semaine précédente + +- La production éolienne du jour précédent et de la semaine précédente + +- La charge d’électricité du jour précédent et de la semaine précédente + +- La température du jour avec différents lissages + +- Le vent et une version pondérée + +- La nébulosité et une version pondérée + +- La date, l’année, le mois et le jour de la semaine + +- Le moment de l’année qui va de 0 (début d’année) à 1 (fin d’année) + +- Les vacances d’été, de Noël et scolaire selon les zones + +- Les jours fériés, la veille et le lendemain d’un jour férié + +- L’heure d’été + +Nous allons dans un premier temps, faire une analyse exploratoire pour chercher des liens entre la variable à prédire et nos covariables. Puis nous ferons la sélection de variables à l’aide de l’analyse précédente, de tests statistiques et de modèles simples. Enfin, nous passerons à la modélisation où nous explorerons modèles linéaires, forêts aléatoires et modèles additifs généralisés. + +Pour accéder au code utilisé, voici le lien du projet : + +https://github.com/LylianChallier/Net-Load_Forecasting + +```{r, include=FALSE} +rm(list=objects()) +graphics.off() +# Load necessary libraries library(mgcv) +library(glmnet) +library(corrplot) +library(gt) +library(randomForest) library(tidyverse) -source('score.R') - -# Importation et prétraitement des données -Data0 <- read_csv('Data/train.csv') +library(ranger) +library(yarrr) +source('R/score.R') +# Options graphique +#options(vsc.dev.args = list(width=1200, height=800, pointsize=10, res=96)) +par(mar = c(5, 5, 5, 5)) # marges : bas, gauche, haut, droite +col <- yarrr::piratepal("basel") # couleur des graphiques +######################### +### Import et Prepro ### +######################### +# Load the data +Data0 <- read_csv('Data/train.csv') # for training and evaluating +Data1 <- read_csv('Data/test.csv') # to make prediction +# Preprocess the data Data0$Time <- as.numeric(Data0$Date) -sel_a <- which(Data0$Year <= 2021) -sel_b <- which(Data0$Year > 2021) +Data1$Time <- as.numeric(Data1$Date) +# Convert categorical variables to factors +discret = c("WeekDays", "BH_before", "BH", "BH_after", + "DLS","Summer_break", "Christmas_break", + "Holiday", "Holiday_zone_a", "Holiday_zone_b", + "Holiday_zone_c", "BH_Holiday", "Month") +Data0[, discret] <- lapply(Data0[, discret], as.factor) +Data1[, discret] <- lapply(Data1[, discret], as.factor) +#Data0 = Data0[-c(2, 6, 7)] +# Split Data0 into train/eval dataset +sel_a = which(Data0$Year<=2019) # training index +sel_b = which(Data0$Year>2019) # eval index ``` -## Méthodologie détaillée +\newpage -### Choix méthodologique : Modèle Additif Généralisé (GAM) +# Analyse exploratoire des données -Le modèle sélectionné pour ce projet est un Modèle Additif Généralisé (GAM) avancé, choisi pour sa capacité à modéliser efficacement des relations complexes, non linéaires et saisonnières entre les variables explicatives et la demande électrique nette. Le modèle proposé intègre plusieurs types de termes : des effets lisses, des interactions tensorisées, et des composantes périodiques adaptées à la saisonnalité et à la tendance de long terme. +## Analyse univariée -``` r -# Formulation avancée du modèle GAM pour la prédiction de Net_demand -equation <- Net_demand ~ s(Time, k = 3, bs = 'cr') + - s(toy, k = 30, bs = 'cc') + - ti(Temp, k = 10, bs = 'cr') + - ti(Temp_s99, k = 10, bs = 'cr') + - s(Load.1, bs = 'cr') + - s(Load.7, bs = 'cr') + - ti(Temp_s99, Temp, bs = c('cr', 'cr'), k = c(10, 10)) + - as.factor(WeekDays) + BH + - te(Temp_s95_max, Temp_s99_max) + - Summer_break + Christmas_break + - te(Temp_s95_min, Temp_s99_min) + - s(Wind, bs = 'cr') + - ti(Nebulosity_weighted) + - ti(Wind_weighted, Temp, bs = 'ts') +Pour commencer, visualisons l'évolution de la demande nette dans le temps, on remarque un cycle annuel. C'est lié à la saisonnalité, on a plus de consommation l'hiver que l'été à la fois car on chauffe plus et on éclaire plus car la nuit tombe plus tôt. On remarque aussi une baisse générale de la consommation au niveau de l'hiver 2020 jusqu'au printemps 2021 sur cette période nous avons vécu trois périodes (de 1 à 2 mois) de confinement dû à la Covid-19 ce qui peut expliquer cette baisse de consommation. + +```{r, echo=FALSE, fig.align='center', fig.width=6, fig.height=4, out.width='70%'} +plot(Data0$Date, Data0$Net_demand, type='l', col=col[1], + xlim=range(Data0$Date, Data1$Date),main="Net_demand dans le temps") +``` + +Après avoir scaler la demande nette et la température pour les avoir à la même échelle, on remarque que la température suit aussi un cycle saisonnier mais inversé par rapport à la demande nette. En effet si l'on trace `- scale(Data0$Temp)` la courbe va se superposer à celle de `scale(Data0$Net_demand)`. La température est donc fortement corrélée négativement avec la demande nette, on voit ici le lien direct avec la consommation pour le chauffage lorsqu'il fait froid. + +```{r, echo=FALSE, fig.align='center', fig.width=6, fig.height=4, out.width='70%'} +par(mfrow=c(1,1)) +plot(Data0$Date, scale(Data0$Net_demand), type='l', col=col[1], main="Net_demand et Temp dans le temps") +lines(Data0$Date, scale(Data0$Temp), type='l', col=col[2]) +legend("topright", legend=c("Net_demand", "Temp"), col=col[1:2], pch=126) +``` + +## Analyse multivariée + +L’analyse multivariée permet d’observer les relations entre la demande nette et les covariables. +Nous allons tracer quelques boîtes à moustaches intéressantes qui mettent en relation la demande nette et des covariables catégorielle. + +On voit bien ici que la demande nette est plus faible lors des jours fériés et des week-ends (boxplot bleu et vert). On a une baisse aussi très importante de la consommation pendant les vacances d'été (boxplot rouge). C'est lié à la consommation des entreprises et de l'industrie qui est très importante, comme durant ces périodes l'activité baisse la consommation aussi. Pour les vacances scolaires avec le système de zone, on voit beaucoup moins voir pas de baisse de la demande, c'est parce que les activités des entreprises et industries se poursuivent normalement. -# Ajustement du modèle GAM sur l'ensemble d'entraînement -model_gam <- gam(equation, data = Data0[sel_a, ], select = TRUE, gamma = 1.5) +Pour l'heure d'été (boxplot rose), on voit aussi une baisse de la demande qui est liée à la saisonnalité et aux températures estivales. + +```{r, echo=FALSE, fig.align='center', fig.width=6, fig.height=4, out.width='100%'} +par(mfrow=c(2, 2), mar=c(2.5, 2.5, 2, 2)) +boxplot(Data0$Net_demand ~ Data0$BH, col=col[1], main="Net_demand si jour férié") +boxplot(Data0$Net_demand ~ Data0$Summer_break, col=col[2], main="Net_demand si summer break") +boxplot(Data0$Net_demand ~ Data0$WeekDays, col=col[3], main="Net_demand selon jour de la semaine") +boxplot(Data0$Net_demand ~ Data0$DLS, col=col[4], main="Net_demand si heure d'été") ``` -## Validation approfondie du modèle -### Prévisions et indicateurs de performance +Maintenant traçons des nuages de points pour observer si la demande nette est corrélée à des covariables continues. + +Sur le premier nuage de point (en bleu), on constate le cycle annuel de la demande nette qui est corrélée non linéairement au moment de l'année. Cela vient encore une fois de la saison et des températures. On remarque aussi une sorte de V au niveau de 0.6, cette baisse de la demande est clairement liée aux vacances d'été dont nous avons vu l'impact avec les boîtes à moustaches précédentes. -Le modèle a été validé par comparaison directe entre les prédictions obtenues et les observations réelles de l'année 2022. Deux critères de performance majeurs sont utilisés : la Racine de l'Erreur Quadratique Moyenne (RMSE) et la Pinball Loss au quantile de 80% pour évaluer spécifiquement la précision des prévisions dans un contexte opérationnel réaliste. +Nous pouvons confirmer la corrélation négative entre la demande nette et la température avec le nuage de point rose. Mais attention la pente descendante s'arrête à partir de 290 Kelvin soit 17°c pour stagner et on aperçoit une légère remontée vers les 295 Kelvin soit 22°c, c'est l'effet de la climatisation sur la consommation électrique. La demande nette et la température sont corrélées non linéairement. -``` r -predictions_sel_b <- predict(model_gam, newdata = Data0[sel_b, ]) +Pour les deux autres nuages de points (rouge et vert), nous ne pouvons pas conclure à une corrélation significative entre la demande nette et le vent ou la nébulosité. -# Calcul du RMSE -rmse_val <- rmse(Data0$Net_demand[sel_b], predictions_sel_b) -print(paste('RMSE de validation :', rmse_val)) -# Calcul de la Pinball Loss (quantile à 80%) -pinball_val <- pinball_loss(Data0$Net_demand[sel_b], predictions_sel_b, 0.8) -print(paste('Pinball Loss à 0.8 :', pinball_val)) +```{r, echo=FALSE, fig.align='center', fig.width=6, fig.height=4, out.width='100%'} +par(mfrow=c(2, 2), mar=c(2.5, 2.5, 2, 2)) +plot(Data0$Net_demand ~ Data0$toy, col=col[1], main="Net_demand selon toy (time of year)") +plot(Data0$Net_demand ~ Data0$Wind, col=col[2], main="Net_demand selon Wind") +plot(Data0$Net_demand ~ Data0$Nebulosity, col=col[3], main="Net_demand selon Nebulosity") +plot(Data0$Net_demand ~ Data0$Temp, col=col[4], main="Net_demand selon Temp") + ``` -## Analyses graphiques détaillées +# Sélection des variables + +Dans cette partie, nous allons essayer de déterminer quelles sont les covariables les plus pertinentes à mettre dans nos modèles. Pour cela nous allons évidemment nous baser sur les analyses précédentes ainsi que sur la matrice de corrélations, des tests de nullité des coefficients, des tests de modèles emboîtés et sur l'importance des variables dans une forêt aléatoire. + + +## Corrélation de Pearson + +Voici la matrice de corrélation des covariables continues ayant une corrélation dont la valeur absolue est supérieure à 0.2 avec la demande nette. Nous avons effectué un test de corrélation de Pearson pour savoir si les variables ont bien une corrélation linéaire significative, si une corrélation n'est pas significative au niveau 5% elle ne s'affiche pas sur la matrice. + -### Distribution des résidus +```{r, echo=FALSE, fig.align='center', fig.width=6, fig.height=6, out.width='80%'} +# Calcul de la corrélation des variables avec Net_demand +par(mfrow=c(1, 1), mar=c(0, 0, 0, 0)) +cor_lin = cor(Data0[,sapply(Data0, is.numeric)], method = "pearson")["Net_demand", ] -Les résidus permettent d'évaluer qualitativement la qualité des prédictions réalisées. +# Définir un seuil et garder les variables linéairment corrélées +seuil = 0.2 +variables_lincor = names(cor_lin[abs(cor_lin) > seuil]) -``` r -residus_val <- Data0$Net_demand[sel_b] - predictions_sel_b -hist(residus_val, breaks = 30, main = "Distribution des Résidus (Validation)", xlab = "Résidus") +# calcul des p-values du test de pearson +# corrélation significative ? +p_values_cor_lin <- cor.mtest(Data0[,variables_lincor], conf.level = 0.95, method="pearson")$p#["Net_demand", ] + +# Calculer et afficher la matrice de corrélation de la selection +cor_lin_mat = cor(Data0[,variables_lincor], method = "pearson") +corrplot(cor_lin_mat, method = "color", + addCoef.col = "black", + tl.col = "black", tl.srt = 45, + number.cex = 0.55, tl.cex=0.6, + sig.level = 0.05, # niveau de significativité à 5% + p.mat = p_values_cor_lin, + insig = "blank", # Ne pas afficher les corrélations non significatives + addgrid.col = NA, cl.pos = "n", + type="lower") ``` -### Comparaison temporelle approfondie +## Test de Student -Une comparaison visuelle précise entre les prévisions et les observations réelles est indispensable pour juger qualitativement de la capacité prédictive du modèle. +Nous avons entraîné un modèle linéaire sur les covariables continues présents dans la matrice ci-dessus afin de tester la nullité des coefficients associé dans un modèle de régression linéaire avec un test de Student. +L'ordre de l'équation a un rôle important sur les tests effectués, nous allons donc prendre l'ordre selon la corrélation. Les variables les plus significatives dans ce modèle sont `Net_demand.1`, `Load.1`, `toy`, `Nebulosity`, `Net_demand.7` et `Temp_s95`. C'est plutôt cohérent, la demande nette et la charge du jour précédent ont un rôle important pour la prédiction de la demande nette, de même que le moment dans l'année et la température. On note qu'ici la version lissée de la température est plus significative. -``` r -plot(Data0$Date[sel_b], Data0$Net_demand[sel_b], type = 'l', col = 'black', main = 'Comparaison Prévisions/Observations', ylab = 'Demande Nette (MW)', xlab = 'Date') -lines(Data0$Date[sel_b], predictions_sel_b, col = 'blue') -legend("topright", legend = c("Observations", "Prévisions GAM"), col = c("black", "blue"), lty = 1) +```{r, echo=FALSE, out.width='60%'} +rl1_eq = Net_demand ~ Net_demand.1 + Load.1 + Net_demand.7 + Load.7 + Temp + + Temp_s95 + Temp_s99 + + Temp_s99_max + Temp_s99_min + + Temp_s95_max + Temp_s95_min + + Solar_power.7 + Solar_power.1 + + Wind_power.7 + toy + Time + Nebulosity +rl1 <- lm(rl1_eq, data = Data0) +summary(rl1) ``` -### Importance et pertinence des prédicteurs +## Analyse de la variance ANOVA + +Nous allons maintenant entraîner un modèle linéaire avec les covariables qualitatives et effectuer une analyse de variance pour détecter si les différences entre les moyennes des classes de nos covariables qualitatives sont significatives. -L'importance relative et la contribution des variables explicatives sont illustrées et quantifiées. +On remarque que la majorité des covariables qualitatives ont des différences significatives entre classes, sauf `Holiday`. Cela veut dire qu'il n'y a pas de différence significative dans la demande nette moyenne s'il y a des vacances ou non, comme on prend ici toutes les vacances on cible beaucoup moins des moments où les activités professionnelles baissent, cela explique en partie pourquoi `Summer_break` est très significatif et pas `Holiday`. -``` r -summary(model_gam) -plot(model_gam, pages=1, residuals=TRUE, shade=TRUE, main="Effets des prédicteurs dans le GAM") +De même pour `Christmas_break`, les congés de Noël couvrent deux semaines et l'activité professionnelle ne ralentit que sur quelques jours, on ne capte pas un vrai changement d'habitude de consommation avec cette variable qui est faiblement significative. + +```{r, echo=FALSE, out.width='60%'} +discret_eq = Net_demand ~ WeekDays + BH_before + BH + BH_after + + DLS + Summer_break + Christmas_break + Holiday + + Holiday_zone_a + Holiday_zone_b + Holiday_zone_c + + BH_Holiday + Month +# anova +anova_result <- aov(discret_eq, data = Data0) +summary(anova_result) ``` -## Validation croisée par blocs : robustesse du modèle +## Test de modèle emboitée + +En combinant les covariables continues et qualitatives intéressantes, nous allons effectuer un test de modèle emboîté pour voir si ce modèle `rl2`` explique aussi bien la demande nette que le modèle complet avec toutes les covariables. -Pour évaluer la robustesse et la stabilité du modèle, une validation croisée par blocs a été effectuée : +Le modèle complet est significativement meilleur que le modèle `rl2`. +De plus si l'on regarde des critères qui pénalisent la dimension comme AIC et BIC, le modèle complet est meilleur. Il n'y a pas de raison de choisir le plus petit. Il faut sélectionner plus de variables. -``` r -Nblock <- 10 -borne_block <- seq(1, length(sel_a), length = Nblock + 1) %>% floor +```{r, echo=FALSE, out.width='60%'} +rl2_eq = Net_demand ~ Net_demand.1 + Load.1 + Net_demand.7 + + Temp_s95 + toy + Nebulosity + WeekDays + BH_before + + BH + BH_after + DLS + Summer_break + Christmas_break + + Holiday_zone_a + Holiday_zone_b + Holiday_zone_c + + BH_Holiday + Month -blockRMSE <- function(equation, block) { - mod <- gam(as.formula(equation), data = Data0[sel_a[-block], ]) - pred <- predict(mod, newdata = Data0[sel_a[block], ]) - return(Data0$Net_demand[sel_a[block]] - pred) -} +rlc_eq = Net_demand ~ Net_demand.1 + Load.1 + Net_demand.7 + + Temp_s95 + toy + Nebulosity + Load.7 + Temp + + Temp_s99 + Temp_s99_max + Temp_s99_min + + Temp_s95_max + Temp_s95_min + Solar_power.7 + Solar_power.1 + + Wind_power.7 + Time + WeekDays + BH_before + + BH + BH_after + DLS + Summer_break + Christmas_break + + Holiday_zone_a + Holiday_zone_b + Holiday_zone_c + + BH_Holiday + Month + Wind_power.1 + Wind + Wind_weighted + + Nebulosity_weighted + Year + +rl2 = lm(rl2_eq, data = Data0) +rlc = lm(rlc_eq, data=Data0) + +anova(rl2, rlc) + +print(paste("BIC du modèle complet : ", round(BIC(rlc), digits=0))) +print(paste("BIC du modèle rl2 : ", round(BIC(rl2), digits=0))) -residus_blocks <- lapply(1:Nblock, function(i) blockRMSE(equation, borne_block[i]:borne_block[i+1])) %>% unlist -rmse_blocks <- rmse(residus_blocks) -print(paste('RMSE Validation Croisée par blocs :', rmse_blocks)) -hist(residus_blocks, breaks = 30, main = "Résidus de Validation Croisée par Blocs", xlab = "Résidus") ``` -## Conclusion et perspectives +## Backward selection + +Pour approfondir la sélection de variable dans les modèles linéaires, nous allons utiliser l'algorithme de "backward selection" basé sur le BIC. Ce critère pénalisant nous permettra d'avoir un modèle efficace avec une dimensionnalité pas trop grande pour éviter le sur-apprentissage. + +```{r, echo=FALSE, out.width='40%'} +# Utiliser step() pour la (backward) sélection de variables +# basée sur le BIC pour pénalisé la dimension du model +n = dim(Data0)[1] +rlb <- step(rlc, direction = "backward", trace=0, k=log(n)) + +# tableau +comp_AIC <- data.frame( + Modèle = c("complet", "backward", "rl2"), + Dimension = c(length(coef(rlc)), length(coef(rlb)), length(coef(rl2))), + AIC = c(AIC(rlc), AIC(rlb), AIC(rl2)), + BIC = c(BIC(rlc), BIC(rlb), BIC(rl2)) +) + +gt(comp_AIC) %>% + tab_header( + title = "Comparaison des Modèles" + ) %>% + fmt_number(columns = AIC, decimals = 0) %>% + fmt_number(columns = BIC, decimals = 0) %>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(Dimension), + rows = Dimension < 40))%>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(AIC), + rows = AIC < 60900))%>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(BIC), + rows = BIC < 60900)) + + + +``` + + +## Importance Plot + +Pour une meilleure appréciation des interactions non linéaires entre la demande nette et nos covariables, nous allons entraîner une forêt aléatoire pour voir l'importance des covariables dans la prédiction de la demande nette. + +On remarque très bien que `Net_demand.1` est la covariable la plus importante dans ce modèle ce qu'on avait aussi pour les modèles linéaires. Avec la règle du coude on peut sélectionner les variables importantes : ``Weekdays`, `BH_Holiday`, les températures, les demandes nettes et les charges. + +```{r, echo=FALSE, fig.align='center', fig.width=6, fig.height=4, out.width='80%'} +# entrainement avec ranger +rf1 <- ranger(rlc_eq, data=Data0, + importance = 'permutation', + num.trees = 1000, sample.fraction=0.1) + +# importance plot et selection graphique avec règle du coude +imp <- rf1$variable.importance +o <- order(imp, decreasing=T) +nom <- names(imp) +par(mfrow=c(1, 1), mar=c(1, 1, 2, 1)) +plot(c(1:length(imp)), imp[o], type='h', ylim = c(0, max(imp) + max(imp)/5), xlab='', ylab='Importance (permutation)', main="Importance Plot ") +K <- length(imp) +text(tail(c(1:length(imp)), K), tail(imp[o]+max(imp/8), K), labels= tail(nom[o], K), pos=3, srt=90, adj=1, cex = 0.7) +points(c(1:length(imp)), imp[o], pch=20) + + +``` + + +# Modélisation + +Maintenant que nous avons de bonnes idées des covariables utiles à la prédiction de la demande nette, nous allons regarder les modèles. Nous allons les évaluer avec le RMSE, le MAPE et la Pinball Loss quantile 0.8, cette dernière est celle qui aura le plus d'importance dans nos choix d'optimisation car c'est celle de l'évaluation des prévisions. + +Dans chaque sous-partie, nous expliquerons comment nous avons construit nos modèles et optimisé les hyperparamètres, puis dans la dernière sous-partie nous donnerons les scores de performances de chaque modèle. + +## Régression Linéaire + +Commençons par des modèles simples que nous avons déjà vus lors de la sélection de variables. Cette fois, nous allons les entraîner sur les données d'entraînement puis les évaluer. On a récupérer l'équation de la régression backward et on a remplacé `Year` par `Net_demand.1` pour avoir de meilleures performances. En plus des régressions classiques nous avons fait une régression pénalisée LASSO avec la nouvelle équation de la régression backward. Pour cette régression LASSO, nous avons optimisé le paramètre de pénalisation avec une validation croisée. + +```{r, echo=FALSE} +rlb_eq = Net_demand ~ Load.1 + Net_demand.7 + toy + Temp + + Temp_s99_min + Temp_s95_max + WeekDays + BH_before + + BH + BH_Holiday + Month + Wind_power.1 + Wind_weighted + + Nebulosity_weighted + Net_demand.1 # enlève Year et ajoute Net_demand.1 + +rl2 = lm(rl2_eq, data = Data0[sel_a, ]) +rlc = lm(rlc_eq, data = Data0[sel_a, ]) +rlb = lm(rlb_eq, data = Data0[sel_a, ]) + +rl2_pred = predict(rl2, newdata= Data0[sel_b,]) +rl2_rmse = rmse.old(Data0$Net_demand[sel_b]-rl2_pred) +rl2_mape = mape(Data0$Net_demand[sel_b], rl2_pred) +rl2_pinball = pinball_loss2(Data0$Net_demand[sel_b]-rl2_pred, 0.8) + +rlc_pred = predict(rlc, newdata= Data0[sel_b,]) +rlc_rmse = rmse.old(Data0$Net_demand[sel_b]-rlc_pred) +rlc_mape = mape(Data0$Net_demand[sel_b], rlc_pred) +rlc_pinball = pinball_loss2(Data0$Net_demand[sel_b]-rlc_pred, 0.8) + +rlb_pred = predict(rlb, newdata= Data0[sel_b,]) +rlb_rmse = rmse.old(Data0$Net_demand[sel_b]-rlb_pred) +rlb_mape = mape(Data0$Net_demand[sel_b], rlb_pred) +rlb_pinball = pinball_loss2(Data0$Net_demand[sel_b]-rlb_pred, 0.8) + +# reg lasso sur la rlb_eq +Data0_lasso = Data0[, c(4, 2, 36, 16, 5, 10, + 9, 17, 18, 19, 30, 22, + 33, 13, 15, 35)] + +X = as.matrix(Data0_lasso[sel_a,-1]) +y = Data0_lasso$Net_demand[sel_a] +X_val = as.matrix(Data0_lasso[sel_b,-1]) +y_val = Data0_lasso$Net_demand[sel_b] + +cv_lasso = cv.glmnet(X, y, alpha = 1) +best_lambda = cv_lasso$lambda.min # optimise le lambda +lasso_model = glmnet(X, y, alpha = 1, lambda = best_lambda*4) +# sinon trop petit et overfit + +lasso_pred = predict(lasso_model, newx = X_val) +lasso_rmse = rmse.old(y_val-lasso_pred) +lasso_mape = mape(y_val, lasso_pred) +lasso_pinball = pinball_loss2(y_val-lasso_pred, 0.8) +rm(Data0_lasso) + +``` + +## Forêts Aléatoires + +Ensuite nous allons faire une forêt aléatoire sur toutes les covariables et optimiser les hyperparamètres `ntree` et `mtry`. +Pour `ntree`, l'erreur MSE calculée sur les données Out Of Bag (OOB) est stable entre 350 et 100 alors on garde la valeur par défaut : `mtree=500`. + +```{r, include=FALSE} +rf2 = randomForest(rlc_eq, data=Data0, ntree=1000) +plot(1:1000, rf2$mse, type='l') +# choix hyperparam +ntree = 500 # est stable en 500 (de 350 à 1000 stable) +# mtry par défaut = 11 +rf2m20 = randomForest(rlc_eq, data=Data0, ntree=ntree, mtry=20) +rf2m5 = randomForest(rlc_eq, data=Data0, ntree=ntree, mtry=5) +rf2m15 = randomForest(rlc_eq, data=Data0, ntree=ntree, mtry=15) + +``` + +Pour `mtry`, nous entraînons quatre forêts avec des valeurs différentes du paramètre. On trace l'erreur MSE calculée sur les données OOB et graphiquement on voit que le modèle `mtry=15` a la plus petite erreur. + +```{r, echo=FALSE, fig.align='center', fig.width=6, fig.height=4, out.width='70%'} +par(mfrow=c(1,1), mar=c(2, 2, 2, 2)) +plot(1:500, rf2$mse[1:500]/n, type='l', col=col[1], main="Optimisation de mtry avec le MSE sur OOB", ylim = c(500, 1000)) +lines(1:500, rf2m20$mse/n, type='l', col=col[2]) +lines(1:500, rf2m5$mse/n, type='l', col=col[3]) +lines(1:500, rf2m15$mse/n, type='l', col=col[5]) +legend("topright", legend=c(5, 11, 15, 20), col=c(col[3], col[1], col[5], col[2] ), lty=1) +mtry = 15 +``` +Nous choisissons donc d'entraîner une forêt aléatoire avec comme hyperparamètres `ntree=500` et `mtry=15` sur les données d'entraînement avant l'évaluation. + +```{r, echo=FALSE} +# training et eval +rf3 = randomForest(rlc_eq, data=Data0[sel_a, ], ntree=ntree, mtry=mtry) +rf3_pred = predict(rf3, newdata= Data0[sel_b,]) +rf3_rmse = rmse.old(Data0$Net_demand[sel_b]-rf3_pred) +rf3_mape = mape(Data0$Net_demand[sel_b], rf3_pred) +rf3_pinball = pinball_loss2(Data0$Net_demand[sel_b]-rf3_pred, 0.8) + +``` + + +## Modèle Additif Généralisé + +Pour finir, nous allons utiliser un modèle additif généralisé (GAM) pour sa capacité à modéliser efficacement des relations non linéaires et cycliques présentent dans les données. L'équation du modèle prend en compte des effets de lissage avec des splines cubiques et cyclique, la voici : + +```{r} +gam_equation <- Net_demand ~ + s(Time, k = 3, bs = 'cr') + # tendance générale temporelle + s(toy, k = 30, bs = 'cc') + # effet cyclique annuel (time of year) + ti(Temp, k = 10, bs = 'cr') + # effet non linéaire de la température + ti(Temp_s99, k = 10, bs = 'cr') + + s(Load.1, bs = 'cr') + s(Load.7, bs = 'cr') + # consommation récente + ti(Temp_s99, Temp, bs = c('cr', 'cr'), k = c(10, 10)) + # interaction température + as.factor(WeekDays) + BH + # effets calendaires + te(Temp_s95_max, Temp_s99_max) + + Summer_break + Christmas_break + # périodes spéciales + te(Temp_s95_min, Temp_s99_min) + + s(Wind, bs = 'cr') + # influence du vent + ti(Nebulosity_weighted) + # nébulosité pondérée + ti(Wind_weighted, Temp, bs = 'ts') # interaction vent-température +``` + + +Le choix des variables et des termes non linéaires provient d'une analyse préliminaire (voir section sur la sélection des variables), destinée à capturer efficacement les interactions et les non-linéarités observées dans les données. Le modèle GAM est entraîné avec un paramètre de pénalisation `gamma = 1.5` afin de prévenir un surajustement excessif. + +```{r, echo=FALSE} +gam_model <- gam(gam_equation, data = Data0[sel_a,], select = TRUE, gamma = 1.5) + +# Evaluation +gam_pred = predict(gam_model, newdata= Data0[sel_b,]) +gam_rmse = rmse.old(Data0$Net_demand[sel_b]-gam_pred) +gam_mape = mape(Data0$Net_demand[sel_b], gam_pred) +gam_pinball = pinball_loss2(Data0$Net_demand[sel_b]-gam_pred, 0.8) + +``` + + +## Comparaison des modèles + +Petit rappel sur les critères que nous utilisons pour l'évaluation de nos modèles : + +- **RMSE (Root Mean Square Error)** : la racine carrée de la moyenne des carrés des erreurs entre les valeurs prédites et les valeurs observées. + +- **MAPE (Mean Absolute Percentage Error)** : Le MAPE est la moyenne des valeurs absolues des erreurs en pourcentage entre les valeurs prédites et les valeurs observées. + +- **Pinball loss quantile 0.8** : La Pinball Loss est une fonction de perte utilisée principalement dans les modèles de régression quantile. Elle mesure l'écart entre les valeurs prédites et observées en fonction d'un quantile spécifié, ici 0.8. C'est une mesure robuste et asymétrique adaptée aux problèmes de prévision comme le nôtre. + +Voici les performances des modèles que nous venons d'entraîner : + +```{r, echo=FALSE, out.width="70%", message=FALSE, warning=FALSE} + +################### +### Loss Table ### +################### + +# tableau +model_losses = data.frame( + Modèle = c("RL2", "RL complet", "RL backward", "Lasso", "RF", "GAM"), + RMSE = c(rl2_rmse, rlc_rmse, rlb_rmse, lasso_rmse, rf3_rmse, gam_rmse), + MAPE = c(rl2_mape, rlc_mape, rlb_mape, lasso_mape, rf3_mape, gam_mape), + Pinball = c(rl2_pinball, rlc_pinball, rlb_pinball, + lasso_pinball, rf3_pinball, gam_pinball) +) + +# afficher le tableau +gt(model_losses) %>% + tab_header( + title = "Pertes par modèle" + ) %>% + fmt_number(columns = RMSE, decimals = 0) %>% + fmt_number(columns = MAPE, decimals = 2) %>% + fmt_number(columns = Pinball, decimals = 0) %>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(RMSE), + rows = RMSE < 2000)) %>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(MAPE), + rows = MAPE < 3.50))%>% + tab_style( + style = cell_text(weight = "bold"), + locations = cells_body( + columns = c(Pinball), + rows = Pinball < 600)) + +``` + + +```{r, include=FALSE} +########################### +### Submission for pred ### +########################### + +# Train our model on all the train dataset +gam_model = gam(gam_equation, data = Data0, select = TRUE, gamma = 1.5) +rf_model = randomForest(rlc_eq, data=Data0, ntree = 500, mtry=15) +rl_model = lm(rlb_eq, data=Data0) + +Data0_lasso = Data0[, c(4, 2, 36, 16, 5, 10, + 9, 17, 18, 19, 30, 22, + 33, 13, 15, 35)] +Data1_lasso = Data1[, c(2, 35, 15, 4, 9, + 8, 16, 17, 18, 29, + 21, 32, 12, 14, 34)] +X = as.matrix(Data0_lasso[,-1]) +newX = as.matrix(Data1_lasso) +y = Data0_lasso$Net_demand +lasso_model = glmnet(X, y, alpha = 1, lambda = best_lambda*4) +rm(Data0_lasso) +rm(Data1_lasso) + +# Make predictions on the test data +gam_pred = predict(gam_model, newdata = Data1) +rf_pred = predict(rf_model, newdata=Data1) +rl_pred = predict(rl_model, newdata=Data1) +lasso_pred = predict(lasso_model, newx = newX) + +# Load the sample submission file +submit = read_delim(file = "Data/sample_submission.csv", delim = ",") + +# Assign the forecasted values to the submission file +submit$Net_demand = lasso_pred + +# Write the submission file to CSV +write.table(submit, file = "Data/submission_lasso.csv", quote = FALSE, sep = ",", dec = '.', row.names = FALSE) + + +``` + + +# Conclusion et discussions + +Les résultats sur l'ensemble d'évaluation sont très convaincants. On voit une réelle amélioration dans les modèles linéaires selon la sélection de variable. Après avoir affiné notre sélection de variables, la régression "backward" a un score tout à fait bon et sa version pénalisée, la régression LASSO a un très bon score aussi. La forêt semble bien avoir été optimisée et le GAM a aussi un bon score. + +En se basant sur cette évaluation, le meilleur modèle est la régression LASSO, mais elle n'a pas été soumise par manque de nombre de soumissions sur la dernière journée, de même pour cette dernière optimisation de la forêt aléatoire. Le modèle que nous avons en score Kaggle est le GAM. + +Pour améliorer ces prédictions, nous pourrions utiliser des régressions quantile, d'autre version de GAM comme les GAM avec traitement des résidus par une forêt aléatoire. Pousser plus loin dans les GAM semble être une bonne idée. Aussi utiliser des méthodes d'agrégation pourrait améliorer les prédictions de nos modèles. + + + -Le modèle GAM avancé présenté offre des résultats robustes et fiables, démontrant sa pertinence pour anticiper la demande électrique nette en France. À l'avenir, des améliorations pourraient être envisagées en intégrant des approches hybrides telles que GAM combiné avec des méthodes de Random Forest, ainsi que des approches adaptatives comme les modèles d'apprentissage en ligne ou les filtres de Kalman dynamiques pour accroître encore la précision des prédictions. diff --git a/select_variables.r b/select_variables.r index d5ec848..1268bcf 100644 --- a/select_variables.r +++ b/select_variables.r @@ -20,13 +20,11 @@ col <- yarrr::piratepal("basel") # couleur des graphiques ### Import et Prepro ### ######################### # Load the data -train <- read_csv('Data/train.csv') # for training and evaluating -test <- read_csv('Data/test.csv') # to make prediction +Data0 <- read_csv('Data/train.csv') # for training and evaluating +Data1 <- read_csv('Data/test.csv') # to make prediction # Preprocess the data -Data0 <- train Data0$Time <- as.numeric(Data0$Date) -Data1 <- test Data1$Time <- as.numeric(Data1$Date) # Convert categorical variables to factors @@ -36,14 +34,13 @@ discret = c("WeekDays", "BH_before", "BH", "BH_after", "Holiday_zone_c", "BH_Holiday", "Month") Data0[, discret] <- lapply(Data0[, discret], as.factor) Data1[, discret] <- lapply(Data1[, discret], as.factor) - -# Split Data0 into train/eval dataset -sel_a = which(Data0$Year<=2021) # training index -sel_b = which(Data0$Year>2021) # eval index - # Drop covariables that are not in test dataset : Load, Solar_power, Wind_power Data0 = Data0[-c(2, 6, 7)] +# Split Data0 into train/eval dataset +sel_a = which(Data0$Year<=2019) # training index +sel_b = which(Data0$Year>2019) # eval index + ############################# ### Corrélation Linéaire ### @@ -56,8 +53,9 @@ cor_lin = cor(Data0[,sapply(Data0, is.numeric)], method = "pearson")["Net_demand seuil = 0.3 variables_lincor = names(cor_lin[abs(cor_lin) > seuil]) -# calcul des p-values pour savoir si c'est significative -p_values_cor_lin <- cor.mtest(Data0[,variables_lincor], conf.level = 0.95)$p#["Net_demand", ] +# calcul des p-values du test de pearson +# corrélation significative ? +p_values_cor_lin <- cor.mtest(Data0[,variables_lincor], conf.level = 0.95, method="pearson")$p#["Net_demand", ] # Calculer et afficher la matrice de corrélation de la selection cor_lin_mat = cor(Data0[,variables_lincor], method = "pearson") @@ -68,7 +66,8 @@ corrplot(cor_lin_mat, method = "color", sig.level = 0.05, # niveau de significativité à 5% p.mat = p_values_cor_lin, insig = "blank", # Ne pas afficher les corrélations non significatives - addgrid.col = NA, cl.pos = "n") + addgrid.col = NA, cl.pos = "n", + type="lower") ################################# @@ -83,7 +82,7 @@ seuil = 0.3 variables_nlincor = names(cor_nlin[abs(cor_nlin) > seuil]) # calcul des p-values pour savoir si c'est significative -p_values_cor_nlin <- cor.mtest(Data0[,variables_nlincor], conf.level = 0.95)$p#["Net_demand", ] +p_values_cor_nlin <- cor.mtest(Data0[,variables_nlincor], conf.level = 0.95, method='spearman')$p#["Net_demand", ] # Calculer et afficher la matrice de corrélation de la selection cor_nlin_mat = cor(Data0[,variables_nlincor], method = "pearson") @@ -101,7 +100,7 @@ corrplot(cor_nlin_mat, method = "color", ############################## # ajuste une reg lin complete -rl.complet <- lm(Net_demand ~. -Date -BH_after, data = Data0) +rl.complet <- lm(Net_demand ~ Net_demand.1 + Load.1, data = Data0) summary(rl.complet) # test de Student : coef egale à 0 ? # variable très significative non nulle (***) : @@ -181,13 +180,6 @@ lines(Data0$Date[sel_b], Data0$Net_demand[sel_b], type='l', col=col[2]) plot(Data0$Date[sel_b], res_backward, type='l', col=col[3], main="Résidus") # residus - -#################################### -### Importance plot avec les RF ### -#################################### - - - ############################### ### Importance plot avec RF ### ###############################